题目来源:http://poj.org/problem?id=2612
模拟,注意理解题目!输出时已经点开的位置也要标记处雷的数目!理解错了,害的WA两次了!
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 11;
bool IsCanGo(int x, int y, int n)
{
if(x < 0 || x >= n || y < 0 || y >= n)
return false;
return true;
}
int main()
{
char Graph1[MAXN][MAXN], Graph2[MAXN][MAXN], Graph3[MAXN][MAXN];
int n, i, j, k, x, y, num;
bool flag;
int dir[8][2] = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}};
while(~scanf("%d", &n))
{
flag = false;
memset(Graph1, 0, sizeof(Graph1));
memset(Graph2, 0, sizeof(Graph2));
for(i = 0; i < n; ++i)
{
for(j = 0; j < n; ++j)
{
Graph3[i][j] = '.';
}
}
for(i = 0; i < n; ++i)
scanf("%s", Graph1[i]);
for(i = 0; i < n; ++i)
scanf("%s", Graph2[i]);
for(i = 0; i < n; ++i)
{
for(j = 0; j < n; ++j)
{
if(Graph2[i][j] == 'x' && Graph1[i][j] == '*')//这个地方一定要注意,走过的也要标记出雷的数目,理解错了,走过的也打成'.'了,wa死了!
flag = true;
if(Graph2[i][j] == 'x' && Graph1[i][j] == '.')
{
num = 0;
for(k = 0; k < 8; ++k)
{
x = i + dir[k][0];
y = j + dir[k][1];
if(IsCanGo(x, y, n) && Graph1[x][y] == '*')
num++;
}
Graph3[i][j] = num + '0';
}
}
}
if(flag)
{
for(i = 0; i < n; ++i)
{
for(j = 0; j < n; ++j)
{
if(Graph2[i][j] == 'x' && Graph1[i][j] != '*')
printf("%c", Graph3[i][j]);
else if(Graph1[i][j] == '*')
printf("*");
else printf(".");
}
printf("\n");
}
}
else
{
for(i = 0; i < n; ++i)
{
for(j = 0; j < n; ++j)
printf("%c", Graph3[i][j]);
printf("\n");
}
}
}
return 0;
}