神奇的NOIP模拟赛 T1 LGTB 玩扫雷

LGTB 玩扫雷

在一个n m 的棋盘上,有位置上有雷(用“*” 表示),其他位置是空地(用“.” 表示)。
LGTB 想在每个空地上写下它周围8 个方向相邻的格子中有几个雷。
请帮助他输出写了之后的棋盘

输入

第一行包含两个整数n, m 代表棋盘大小
接下来n 行,每行m 个字符,代表棋盘
1 n,m 1000

输出

输出包含n 行,每行m 个字符,代表LGTB 写了数字之后的棋盘

样例

样例输入
3 3
*.*
...
*.*

样例输出
*2*
242
*2*

解题报告:

拿到这道题,有两种解法,第一种是枚举每一个‘ . ’  ,搜它周围的‘ * ’的个数;第二种是枚举每一个‘ * ’,在它周围一圈不是‘ * ’的格子加上1,然后直接输出就可以了。先开始是想的第一种,又想了一下,这道题神奇地只有64M 的内存限制,好像雷更少一点,所以选择枚举雷。

但是又来了一个一直没怎么弄清楚地问题,读入char 和string 。先开始用的char  然后 scanf 结果只读了一行,gets()也读不全,就换成string cin>>s;一次性读一行来add 就好了。这里浪费了20多分钟吧。于是,这道水题我花了1个小时

结果又手抽地把判断边界 y<=m 打成了 y<=n (.....)就错了3组;

还学习到了一个读换行符的 getchar();

  另外,还有从另一个可怜的同学那里吸取的教训  ios::sync_with_stdio(false); 加快cin速度的语句不能乱用。不与scanf混用。

代码如下:

 #include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int n,m;
int mp[][];
//char p[2];
string s;
const int zl[][]={{-,-,-,,,,,},{-,,,-,,-,,}};
void add(int a,int b)
{
mp[a][b]=-;
for (int i=;i<=;i++)
{
int x=a+zl[][i],y=b+zl[][i];
if (x>&&x<=n&&y>&&y<=m&&mp[x][y]>=)
mp[x][y]++;
}
}
int main()
{
freopen("mine.in","r",stdin);
freopen("mine.out","w",stdout);
cin>>n>>m;
// p[0]='*';
for (int i=;i<=n;i++)
{
//memset(s,0,sizeof(s));
cin>>s;
for (int j=;j<=m-;j++)
{
if (s[j]=='*') add(i,j+);
} }
for (int i=;i<=n;i++)
{
for (int j=;j<=m;j++)
{
if (mp[i][j]<)
cout<<'*';
else printf("%d",mp[i][j]);
}
printf("\n");
}
return ;
}
上一篇:csuoj 1350: To Add Which?


下一篇:python3开发进阶-Django框架起飞前的准备