## 10189 - Minesweeper

Moderator: Board moderators

arif_pasha
New poster
Posts: 42
Joined: Fri Jun 13, 2003 3:47 pm
Contact:
1. use gets() to get the line.
2. use larger array size [say 110]

Hope it helps..

New poster
Posts: 13
Joined: Sun Mar 04, 2007 8:40 pm
ok, the problem was only the Max of the tables i make the tables at 110 and it was accepted, thanks, real thanks arif pasha, it's also works with Tables with 101!
/*No Comment*/

Amichelg75
New poster
Posts: 1
Joined: Wed Mar 07, 2007 9:35 pm

### 10189 - Output Limit Exceeded!!

Hello, My code is:

/***********************
solution to problem ,
date: 06/03/2007
***********************/

#include<stdio.h>
#include<string.h>
main(){

char Minesweeper[100][100];
int NFilas, NColumnas, li, lj, ContBombs, ContFields;

ContFields = 1;

do{
/* Captura del Numero de Filas y Columnas */
scanf("%d %d", &NFilas, &NColumnas);
fflush(stdin);
/* Captura del tablero de Minesweeper */
if( (NFilas > 0) && (NColumnas > 0) )
{

for ( li = 0; li < NFilas; li ++ )
{

for ( lj = 0; lj < NColumnas; lj++ )
{
scanf("%c", &Minesweeper[li][lj]);
}
fflush(stdin);
} /*Fin Captura*/

/* Transformacion de la Matriz*/
for ( li = 0;li < NFilas; li++ )
{

for ( lj = 0; lj < NColumnas; lj++)
{

if ( Minesweeper[li][lj] =='.' )
{

ContBombs = 0;

if ( (li-1 >=0) && (lj-1 >= 0) &&
( Minesweeper[li-1][lj-1] == '*' ) )
{
ContBombs ++;
}
if ( (lj-1 >= 0) &&
( Minesweeper[li][lj-1] == '*' ) )
{
ContBombs ++;
}
if ( (li+1 < NFilas) && (lj-1 >= 0) &&
( Minesweeper[li+1][lj-1] == '*' ) )
{
ContBombs ++;
}
if ( (li-1 >=0) && (lj+1 < NColumnas) &&
( Minesweeper[li-1][lj+1] == '*' ) )
{
ContBombs ++;
}
if ( (lj+1 < NColumnas) &&
( Minesweeper[li][lj+1] == '*' ) )
{
ContBombs ++;
}
if ( (li+1 < NFilas) && (lj+1 < NColumnas) &&
( Minesweeper[li+1][lj+1] == '*' ) )
{
ContBombs ++;
}
if ( (li-1 >= 0) &&
( Minesweeper[li-1][lj] == '*' ) )
{
ContBombs ++;
}
if ( (li+1 < NFilas) &&
( Minesweeper[li+1][lj] == '*' ) )
{
ContBombs ++;
}
switch (ContBombs)
{
case 0:
Minesweeper[li][lj] = '0';
break;
case 1:
Minesweeper[li][lj] = '1';
break;
case 2:
Minesweeper[li][lj] = '2';
break;
case 3:
Minesweeper[li][lj] = '3';
break;
case 4:
Minesweeper[li][lj] = '4';
break;
case 5:
Minesweeper[li][lj] = '5';
break;
case 6:
Minesweeper[li][lj] = '6';
break;
case 7:
Minesweeper[li][lj] = '7';
break;
case 8:
Minesweeper[li][lj] = '8';
break;
} /*Fin Switch*/
} /*Fin Si '.'*/

} /*Fin For lj*/
}/*Fin For li*/

printf ("Field #%d:\n", ContFields);
for ( li = 0;li < NFilas; li++ )
{

for ( lj = 0; lj < NColumnas; lj++)
{
printf ("%c", Minesweeper[li][lj]);
}
printf("\n");
} /*Fin For Imprime*/

printf ("\n");
ContFields ++;
}
}while(NFilas > 0 && NColumnas > 0);
return 0;
}

online-Judged Output Limit Exceeded!!, Why?

New poster
Posts: 8
Joined: Sat Mar 10, 2007 10:20 am

### 10189 WA?? PLZ HELP!!

"There must be an empty line between field outputs."
Am I right when input is "0 0" ??

thank you for help!!!:)

Code: Select all

``````#include<stdio.h>

int main()
{
int k,l,size_1,size_2,i,j,I,J,boom=0,num=1,end=0;
char a[200][200];
char b[200][200];

scanf(" %d %d",&size_1,&size_2);

while(size_1!=0 && size_2!=0)
{

for(k=0;k<size_1;k++)
for(l=0;l<size_2;l++)
scanf(" %c",&a[k][l]);

for(i=0;i<size_1;i++)
{
for(j=0;j<size_2;j++)
{
if(a[i][j]=='*')
{
b[i][j]=a[i][j];
continue;
}
else if(a[i][j]=='.')
{
for(I=i-1;I<i+2;I++)
{
for(J=j-1;J<j+2;J++)
{
if(I<0 || J<0 || I==i && J==j)
continue;
else if(a[I][J]=='*')
boom++;
}
}
b[i][j]=boom;
boom=0;
}
}
}

if(end)
printf("\n");

printf("Field #%d:\n",num++);

for(k=0;k<size_1;k++)
{
for(l=0;l<size_2;l++)
{
if(b[k][l]=='*')
printf("%c",b[k][l]);
else
printf("%d",b[k][l]);
}
printf("\n");

}

end=1;

scanf(" %d %d",&size_1,&size_2);

}
return 0;
}``````

roozbeh84
New poster
Posts: 1
Joined: Thu Apr 12, 2007 7:51 pm

### 10189 -- Minesweeper

Folks,

This is my code in Java. After struggling for 1 day to solve "Compile Error" now I get "Wrong Answer"

Anybody PLEASE can tell me where am I wrong?
Thx...

/*
* Main.java
* java program model for http://www.programming-challenges.com
*/

import java.io.*;
import java.util.*;

class Main implements Runnable{
// Provided by Programming-challenges, edit for style only
byte line[] = new byte [maxLength];
int length = 0;
int input = -1;
try{
while (length < maxLength){//Read untill maxlength
if ((input < 0) || (input == '\n')) break; //or untill end of line ninput
line [length++] += input;
}

if ((input < 0) && (length == 0)) return null; // eof
return new String(line, 0, length);
}catch (IOException e){
return null;
}
}

public static void main(String args[]) // entry point from OS
{
Main myWork = new Main(); // Construct the bootloader
myWork.run(); // execute
}

public void run() {
new myStuff().run();
}
}

class myStuff implements Runnable{
public void run(){

try
{

String line = "";
StringTokenizer st;
int n = 0;
int m = 0;
int counter = 0;

while(true)
{
st = new StringTokenizer(line);

n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());

//System.out.println(n + " " + m);
if(n==0 && m==0)
break;

String[][] arr = new String[110][110];
counter++;

for(int i=0;i<110;i++)
{
for(int j=0;j<m;j++)
{
arr[j] = String.valueOf(0);
}
}

int mcount = 0;
for(int i=0;i<n;i++)
{

mcount = 0;

char[] chars = line.toCharArray();
int a=0;

while(a<m)
{
if(chars[a]=='*')
{
arr[mcount] = "*";
if(i+1<=n)
{
try
{
int val = Integer.parseInt(arr[i+1][mcount]);
val++;
arr[i+1][mcount] = String.valueOf(val);
}
catch(NumberFormatException n1)
{
;
}
}
if(i-1>=0)
{
try
{
int val = Integer.parseInt(arr[i-1][mcount]);
val++;
arr[i-1][mcount] = String.valueOf(val);
}
catch(NumberFormatException n2)
{

}
}
if(mcount+1<=m)
{

try
{
int val = Integer.parseInt(arr[mcount+1]);
val++;
arr[mcount+1] = String.valueOf(val);
}
catch(NumberFormatException n3)
{

}
}
if(mcount-1>=0)
{

try
{
int val = Integer.parseInt(arr[mcount-1]);
val++;
arr[mcount-1] = String.valueOf(val);
}
catch(NumberFormatException n3)
{

}
}
if(i+1<=n && mcount+1<=m)
{
try
{
int val = Integer.parseInt(arr[i+1][mcount+1]);
val++;
arr[i+1][mcount+1] = String.valueOf(val);
}
catch(NumberFormatException n4)
{

}
}
if(i+1<=n && mcount-1>=0)
{
try
{
int val = Integer.parseInt(arr[i+1][mcount-1]);
val++;
arr[i+1][mcount-1] = String.valueOf(val);
}
catch(NumberFormatException n5)
{
;
}
}
if(i-1>=0 && mcount+1<=m)
{
try
{
int val = Integer.parseInt(arr[i-1][mcount+1]);
val++;
arr[i-1][mcount+1] = String.valueOf(val);
}
catch(NumberFormatException n6)
{
;
}
}
if(i-1>=0 && mcount-1>=0)
{
try
{
int val = Integer.parseInt(arr[i-1][mcount-1]);
val++;
arr[i-1][mcount-1] = String.valueOf(val);
}
catch(NumberFormatException n7)
{
;
}
}
}
mcount++;
a++;
}

}

System.out.println("Field #" + counter + ":");
for(int l=0;l<n;l++)
{
for(int j=0;j<m;j++)
{
System.out.print(arr[l][j]);
}
System.out.println();
}

System.out.println();

}

// You can insert more classes here if you want.

}
catch(Exception e)
{
;
}

}
}

New poster
Posts: 4
Joined: Sun Apr 15, 2007 1:28 am

### Reading a variable length input

Hi everyone.

I was looking at this problem and i cant figure a way to store all input without allocating memory dynamically. If somebody could help i would appreciate.

TIA

sohel
Guru
Posts: 856
Joined: Thu Jan 30, 2003 5:50 am
Location: New York

### :-?

Why do you have to store all the inputs?

Just take one case -> process it -> print the result -> take next case, reusing the old array -> ....

Code: Select all

``````   char input[101][101];
int r, c, i;
while( scanf("%d %d", &r, &c) == 2 && (r||c) ) {
for(i=0;i<r;i++) scanf("%s", input[i]);
// process
// print output
}

``````
This should work!

New poster
Posts: 4
Joined: Sun Apr 15, 2007 1:28 am
My mistake, i just realised there is a maximum line limit.

But what if no limit is given.

PS: Of course i was not planning to store all the input, just the current input.

Neli
New poster
Posts: 7
Joined: Thu May 03, 2007 8:35 am
Location: Sylhet
Contact:

### WA-Help

I took in the input in a Long array,and checked 8 particular case.
Plz help me.

dttri
New poster
Posts: 3
Joined: Thu Apr 05, 2007 7:13 pm
Location: Vietnam

### 10189 in Java - WA

Hi everybody,
I search the forums but can't find any topic similar to mine. I'm sure about the "empty line between case" as many other topics. Is there any wrong with my code?

Thank you

Code: Select all

``````
import java.io.*;
import java.util.*;

class Main
{
//This is a utility function to read from stdin
//provided by UVA: do not modify
{
byte lin[] = new byte [maxLg];
int lg = 0, car = -1;
String line = "";

try
{
while (lg < maxLg)
{
if ((car < 0) || (car == '\n')) break;
lin [lg++] += car;
}
}
catch (IOException e)
{
return (null);
}

if ((car < 0) && (lg == 0)) return (null);  // eof
return (new String (lin, 0, lg));
}

static void writeLine(String s)
{
System.out.println(s);
}

static void writeLine()
{
System.out.println();
}

//entry point from OS
public static void main (String[] args)
{
Main myWork = new Main();  // create a dinamic instance
myWork.begin();            // the true entry point
}

void begin()
{
String input;
StringTokenizer idata;
char[][] cell;
char[][] output;
int row,col;
int caseNumber=1;
while(true)
{
idata = new StringTokenizer(input);
row = Integer.parseInt(idata.nextToken());
col = Integer.parseInt(idata.nextToken());
if(row==0 && col==0)break;
cell = new char[row][col];
output = new char[row][col];
//read all row and assign output
for(int i=0;i<row;i++)
{
//assign value for each cell
for(int j=0;j<col;j++)
{
cell[i][j]=input.charAt(j);
output[i][j]='0';
}
}
//process all cell
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
if(cell[i][j]=='*')
{
output[i][j]='*';
continue;
}
for(int x=-1;x<=1;x++)
{
for(int y=-1;y<=1;y++)
{
if(x==0 && y==0)continue;
if(i+x<0 || i+x>=row || j+y<0 || j+y>=col)continue;
if(cell[i+x][j+y]=='*')output[i][j]++;
}
}
}
}
if(caseNumber!=1)
{
writeLine();
}
writeLine("Field #"+caseNumber+":");
for(int i=0;i<row;i++)
{
String s=new String(output[i]);
writeLine(s);
}
caseNumber++;
}
}
}

``````

dttri
New poster
Posts: 3
Joined: Thu Apr 05, 2007 7:13 pm
Location: Vietnam
I copy my Java code above and translate it into C++ and I got Accepted. Don't know why the Java version doesn't work. I think the Java judge here is not well supported. And I don't know why UVA use GCJ instead of Java from Sun?

Jan
Guru
Posts: 1334
Joined: Wed Jun 22, 2005 10:58 pm
Contact:

Input:

Code: Select all

``````5 5
*****
*...*
*.*.*
*...*
*****
4 4
****
*..*
*..*
****
0 0``````
Output:

Code: Select all

``````Field #1:
*****
*646*
*4*4*
*646*
*****

Field #2:
****
*55*
*55*
****``````
Hope these help.
Ami ekhono shopno dekhi...
HomePage

New poster
Posts: 38
Joined: Tue Jul 17, 2007 3:21 pm
Location: East West University
simple problem,simple code, but getting WA. where is the bug? plz tell me.
thanks

Code: Select all

``````#include<iostream>
#include<stdio.h>

using namespace std;

int main()
{
int m,n,i,j,count,flag=0,field=1;
char a[109][109];

while(cin>>m>>n)
{
if(m==0&&n==0)
break;
if(flag==1)
cout<<endl;

for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>a[i][j];

cout<<"Field #"<<field<<":"<<endl;

for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
count=0;
if(a[i][j]!='*')
{

if((a[i][j-1]=='*')&&j!=0)
count++;
if((a[i-1][j-1]=='*')&&i!=0&&j!=0)
count++;
if((a[i-1][j]=='*')&&i!=0)
count++;
if((a[i-1][j+1]=='*')&&i != 0 && j != n)
count++;
if((a[i][j+1]=='*')&& j != n )
count++;
if((a[i+1][j+1]=='*')&& i != m && j != n )
count++;
if((a[i+1][j]=='*')&& i != m )
count++;
if((a[i+1][j-1]=='*')&& i != m && j != 0 )
count++;
cout<<count;
}
else cout<<"*";

}
cout<<endl;
}
field++;
flag=1;
}
return 0;
}

``````
Eagle er moto daana meley urbo

Jan
Guru
Posts: 1334
Joined: Wed Jun 22, 2005 10:58 pm
Contact:
Test the cases.

Input:

Code: Select all

``````5 5
*****
*...*
*.*.*
*...*
*****
4 4
*.*.
.***
**..
.*.*
0 0``````
Output:

Code: Select all

``````Field #1:
*****
*646*
*4*4*
*646*
*****

Field #2:
*4*3
4***
**63
3*3*``````
Hope these help.
Ami ekhono shopno dekhi...
HomePage