http://www.programming-challenges.com/pg.php?page=downloadproblem&probid=110102&format=html
UVA 10189_Minesweeper
题目大意:
输入包含多个矩阵,每个矩阵包含n和m两个数字,(0<n,m<=100),
分别代表这个矩阵的行数和列数,有地雷的地方为'*',其他地方为'.',n==m==0时输入结束。
输出:不为雷的地方,输出它周围雷的个数,是雷,则输出'*',
每两组测试数据中间空一行(其中最后一组后没有空行)。
简单题:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define N 110
char str[N][N];
int num[N][N];
int main()
{
int n,m,i,j,t=1;
while(scanf("%d%d",&n,&m)!=EOF&&n||m)
{
memset(num,0,sizeof(num));
for(i=1;i<=n;i++)
scanf("%s",str[i]+1); //每个字符串从下标为1开始读入
if(t>1)
printf("\n");
printf("Field #%d:\n",t++);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(str[i][j]=='*') //如果是'*',则其周围8个都加一
{
num[i-1][j-1]++;
num[i-1][j]++;
num[i-1][j+1]++;
num[i][j-1]++;
num[i][j+1]++;
num[i+1][j-1]++;
num[i+1][j]++;
num[i+1][j+1]++;
}
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(str[i][j]=='*')
printf("*");
else
printf("%d",num[i][j]);
}
printf("\n");
}
}
return 0;
}
此代码在空间和时间上都可以优化