http://www.programming-challenges.com/pg.php?page=downloadproblem&probid=110102&format=html

UVA 10189_Minesweeper

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=29&page=show_problem&problem=1130

题目大意:

输入包含多个矩阵,每个矩阵包含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;
}

此代码在空间和时间上都可以优化

posted on 2012-02-28 16:50  pcoda  阅读(241)  评论(0编辑  收藏  举报