Im trying to solve a ACM problem 10189,

It looks ok to me...but, online judge is showing wrong answer...

can anyone help me to figure out the problem.

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

int row = 1, column = 1,i=0, j=0, a=0, b=0;
char array[100][100] = {0};

int change(int a, int b)
{
if(!(a < 0) && !(a > row -1) && !(b<0) && !(b > column -1))
if(!(array[a][b] == '*'))
if(array[a][b] == '.')
array[a][b] = 49;
else
++array[a][b];
return 0;
}
int main()
{
freopen("in.txt", "r", stdin);

int count = 0;

while(!(row == 0 && column == 0))
{

scanf("%d %d", &row, &column);

if(row == 0 && column == 0) return 0;
count++;

for(i=0; i<row; i++)
{
scanf("\n");
for(j=0; j<column; j++)
{
scanf("%c", &array[i][j]);

}
}

for(i=0; i<row; i++)
{
for(j=0; j< column; j++)
{
if(array[i][j] == '*')
{
a = i-1;
b = j-1;
change(a, b);

a = i-1;
b = j;
change(a, b);

a = i-1;
b = j+1;
change(a, b);

a = i;
b = j+1;
change(a, b);

a = i+1;
b = j+1;
change(a, b);

a = i+1;
b = j;
change(a, b);

a = i+1;
b = j-1;
change(a, b);

a = i;
b = j-1;
change(a, b);
}
}
}

printf("Field #%d:", count);

for(i=0; i<row; i++)
{
printf("\n");

for(j=0; j< column; j++)
{
if(array[i][j] == '.') array[i][j] = 48;
printf("%c",array[i][j]);
}

}
printf("\n\n");
}

return 0;
}``````

Though, i have a little confusion about the double "new line"(\n) at the end of the program...i have managed to get ride of it.But it is still showing Wrong Answer. :(

I think your i and j checks are OK, the thing that would seem obvious to cause an issue would be the check grid boundaries... But I've not looked at your code closely at all...

I think your i and j checks are OK, the thing that would seem obvious to cause an issue would be the check grid boundaries...

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

int main()
{
int row = 4, column = 4, i = 3, j = 4;
//change i and j for checking the validity

if(!(i < 0) && !(i > row -1) && !(j<0) && !(j > column -1))
printf("valid position");
else
printf("invalid position");
return 0;
}``````

This snippet works perfect...so, how would that code could result in an error?
:(

I honestly don't care to look into this properly because I'm incredibly lazy but I would...

1) validate each call to your i j check function. For example, if BOTH i and j are within the boundaries give it a green light.
2)Check that you have remember the arrays start at [0,0] and not [1,1] which is a common mistake.

good luck kiddo.

Actually that check function looks good also...

Seems that snippet looks OK.

I would then further split your program up.

Have a function checkValid(). If checkValid() returns true, and that array position == '*' increment count otherwise do nothing.

1) validate each call to your i j check function. For example, if BOTH i and j are within the boundaries give it a green light.

2)Check that you have remember the arrays start at [0,0] and not [1,1] which is a common mistake.

good luck kiddo.

yah, i and j is always within boundary...that's for sure.... :D

Seems that snippet looks OK.

I would then further split your program up.

Have a function checkValid(). If checkValid() returns true, and that array position == '*' increment count otherwise do nothing.

isn't it kinda little....meaningless..cause, im doing the same thing that ur telling....they are being checking at the successive line...so, putting them on the same line wont do any good....while the judge is telling me wrong answer...is it?

I isolated the checking part...but, still there is no improvement.

I don't know dude...

Mine seems to work...

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

int change ( int i, int j );

int row = 3;
int column = 5;

int main()
{

char grid[100][100] = {"**...", ".....", ".*..."};

int i, j;
int a, b;

int counter = 0;

for ( i = 0; i < row; i++ )
{
printf ( "\n" );

for ( j = 0; j < column; j++ )
{

if ( grid[i][j] == '.' )
{
a = i - 1;
b = j - 1;
if ( change ( a, b ) == 1 && grid[a][b] == '*' )
{
counter++;
}

a = i - 1;
b = j;
if ( change ( a, b ) == 1 && grid[a][b] == '*' )
{
counter++;
}

a = i - 1;
b = j + 1;
if ( change ( a, b ) == 1 && grid[a][b] == '*' )
{
counter++;
}

a = i;
b = j + 1;
if ( change ( a, b ) == 1 && grid[a][b] == '*' )
{
counter++;
}

a = i + 1;
b = j + 1;
if ( change ( a, b ) == 1 && grid[a][b] == '*' )
{
counter++;
}
a = i + 1;
b = j;
if ( change ( a, b ) == 1 && grid[a][b] == '*' )
{
counter++;
}

a = i + 1;
b = j - 1;
if ( change ( a, b ) == 1 && grid[a][b] == '*' )
{
counter++;
}

a = i;
b = j - 1;
if ( change ( a, b ) == 1 && grid[a][b] == '*' )
{
counter++;
}

printf ( "%d", counter );

counter = 0; //reset
}

else
printf ( "%c", '*' );

}
}

getchar();
return 0;

}

int change ( int i, int j )
{

//int row = 4, column = 4;
//change i and j for checking the validity

if ( ! ( i < 0 ) && ! ( i > row - 1 ) && ! ( j < 0 ) && ! ( j > column - 1 ) )
return 1; //valid
else
return 0; //invalid
}``````

That was the last edit...

Good luck... I hope that helped.

That was the last edit...

Good luck... I hope that helped.

In the light of ur code i modified mine...

But still Wrong Answer... :( :( :(
....any more suggestion!

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

int row = 1, column = 1,i=0, j=0, a=0, b=0, found=0;
char array[100][100] = {0};

int checkValid(int a, int b)
{
if(!(a < 0) && !(a > row -1) && !(b<0) && !(b > column -1))
return 1;
else
return 0;
}
int main()
{
//  freopen("in.txt", "r", stdin);

int count = 0;

while(!(row == 0 && column == 0))
{

scanf("%d %d", &row, &column);

if(row == 0 && column == 0) return 0;
if(count > 0) printf("\n\n");
count++;

for(i=0; i<row; i++)
{
scanf("\n");
for(j=0; j<column; j++)
{
scanf("%c", &array[i][j]);

}
}

printf("Field #%d:", count);
for(i=0; i<row; i++)
{
printf("\n");
for(j=0; j< column; j++)
{
if(array[i][j] == '.')
{
a = i-1;
b = j-1;
if(checkValid(a, b) && array[a][b] == '*')
found++;

a = i-1;
b = j;
if(checkValid(a, b) && array[a][b] == '*')
found++;

a = i-1;
b = j+1;
if(checkValid(a, b) && array[a][b] == '*')
found++;

a = i;
b = j+1;
if(checkValid(a, b) && array[a][b] == '*')
found++;

a = i+1;
b = j+1;
if(checkValid(a, b) && array[a][b] == '*')
found++;

a = i+1;
b = j;
if(checkValid(a, b) && array[a][b] == '*')
found++;

a = i+1;
b = j-1;
if(checkValid(a, b) && array[a][b] == '*')
found++;

a = i;
b = j-1;
if(checkValid(a, b) && array[a][b] == '*')
found++;

printf("%d", found);

found = 0;
}
else printf("*");
}
}
}

return 0;
}``````

Kiddo, what can't you do? Get it to work with scanf?

The algo works as far as I'm concerned. Everything else is just pedantic and that's basic c... Go look at a input tute or file handling tute.

It was accepted at last...there was a small presentation error.Extra new line...grrr...

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

int row = 1, column = 1,i=0, j=0, a=0, b=0;
char array[100][100] = {0};

int change(int a, int b)
{
if(!(a < 0) && !(a > row -1) && !(b<0) && !(b > column -1))
if(!(array[a][b] == '*'))
if(array[a][b] == '.')
array[a][b] = 49;
else
++array[a][b];
return 0;
}
int main()
{
//  freopen("in.txt", "r", stdin);

int count = 0;

while(!(row == 0 && column == 0))
{

scanf("%d %d", &row, &column);

if(row == 0 && column == 0) return 0;
count++;

for(i=0; i<row; i++)
{
scanf("\n");
for(j=0; j<column; j++)
{
scanf("%c", &array[i][j]);

}
}

for(i=0; i<row; i++)
{
for(j=0; j< column; j++)
{
if(array[i][j] == '*')
{
change(i-1, j-1);
change(i-1, j);
change(i-1, j+1);

change(i, j+1);

change(i+1, j+1);
change(i+1, j);
change(i+1, j-1);

change(i, j-1);
}
}
}
if(!(count > 1))
printf("Field #%d:", count);
else
printf("\nField #%d:", count);
for(i=0; i<row; i++)
{
printf("\n");

for(j=0; j< column; j++)
{
if(array[i][j] == '.') array[i][j] = 48;
printf("%c",array[i][j]);
}

}
printf("\n");
}

return 0;
}``````