题意:开始输出雷的分布,然后输出操作,X代表点在这个区域上,分为两种情况,如果没有踩到雷,那么输出这个地方周围雷的个数,没有操作的点输出“.”,踩到雷的话,把所有雷的地方输出“*”,然后操作的地方输出周围雷的个数。
挺容易的,但是WA了 半天。。。后来还是看了依然的报告,写的很简洁~ o(︶︿︶)o 唉。。差距
#include<iostream>
using namespace std;
int dir[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
int main() {
int a[15][15];
bool touch[15][15],mine[15][15];
int n;
char c;
while (scanf("%d",&n)!=EOF) {
memset(a,0,sizeof(a));
memset(mine,false,sizeof(mine));
memset(touch,false,sizeof(touch));
for (int i = 0 ; i < n ; i ++)
for (int j = 0 ; j < n ; j ++) {
cin>>c;
if (c == '*') {
mine[i][j] = true;
for (int k = 0 ; k < 8 ; k ++) {
int tx = i + dir[k][0];
int ty = j + dir[k][1];
a[tx][ty] ++; //这样就记录了一个地方周围雷的个数
}
}
}
bool flag = false;
for (int i = 0 ; i < n ; i ++)
for (int j = 0 ; j < n ; j ++) {
cin>>c;
if (c == 'x') {
touch[i][j] = true;
if (mine[i][j]) flag = true;
}
}
if (flag) {//踩到雷
for (int i = 0 ; i < n ; i ++) {
for (int j = 0 ; j < n ; j ++) {
if (mine[i][j]) printf("*");
else {
if (touch[i][j]) printf("%d",a[i][j]);
else printf(".");
}
}
printf("\n");
}
} else { //没踩到
for (int i = 0 ; i < n ; i ++){
for (int j = 0 ; j < n ; j ++) {
if (touch[i][j]) printf("%d",a[i][j]);
else printf(".");
}
printf("\n");
}
}
}
}