华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1364|回复: 3
打印 上一主题 下一主题

P2670 扫雷游戏

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2018-4-19 14:18:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://www.luogu.org/problemnew/show/P2670题目描述
扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。

现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。

注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。

输入输出格式
输入格式:
输入文件第一行是用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数。

接下来n行,每行m个字符,描述了雷区中的地雷分布情况。字符’*’表示相应格子是地雷格,字符’?’表示相应格子是非地雷格。相邻字符之间无分隔符。

输出格式:
输出文件包含n行,每行m个字符,描述整个雷区。用’*’表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。

输入输出样例
输入样例#1:
3 3
*??
???
?*?
输出样例#1:
*10
221
1*1
输入样例#2:
2 3
?*?
*??
输出样例#2:
2*1
*21
说明
对于 100%的数据, 1≤n≤100, 1≤m≤100。

回复

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
沙发
 楼主| 发表于 2018-7-2 16:00:07 | 只看该作者
  1. #include <iostream>
  2. using namespace std;
  3. const int mm=110;
  4. char a[mm][mm];
  5. int dr[]= {-1,-1,-1,+0,+0,+1,+1,+1};
  6. int dc[]= {-1,+0,+1,-1,+1,-1,+0,+1};
  7. int r,c,tr,tc,s,n,m,d;
  8. int main()
  9. {
  10.     cin>>n>>m;
  11.     ///首行首列被空着了 相当于外圈被空着了
  12.     for (r=1; r<=n; r++)
  13.         for (c=1; c<=m; c++)  cin>>a[r][c];


  14.     for (r=1; r<=n; r++)
  15.     {
  16.         for (c=1; c<=m; c++)
  17.             if (a[r][c]=='*') cout<<'*';
  18.             else
  19.             {
  20.                 for (s=d=0; d<=7; d++)
  21.                 {
  22.                     tr=r+dr[d],tc=c+dc[d];
  23.                     s=s+(a[tr][tc]=='*');
  24.                 }
  25.                 cout<<s;
  26.             }
  27.         cout<<endl;
  28.     }
  29.     return 0;
  30. }
复制代码
回复 支持 反对

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
板凳
发表于 2018-8-24 13:05:49 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int n,m,dr[8]={-1,-1,-1,0,0,+1,+1,+1},dc[8]={-1,0,+1,-1,+1,-1,0,+1},mine;
  4. char ch[101][101];
  5. int main()
  6. {
  7.     cin>>n>>m;
  8.     for(int i=1;i<=n;i++)
  9.         for(int j=1;j<=m;j++)
  10.             cin>>ch[i][j];
  11.     for(int i=1;i<=n;i++)
  12.     {
  13.         for(int j=1;j<=m;j++)
  14.         {
  15.              if(ch[i][j]=='?')
  16.             {
  17.                 mine=0;
  18.                 for(int k=0;k<=7;k++)
  19.                     if(ch[i+dr[k]][j+dc[k]]=='*')mine++;
  20.                 ch[i][j]='0'+mine;
  21.             }
  22.             cout<<ch[i][j];
  23.         }
  24.         cout<<endl;
  25.     }
  26.     return 0;
  27. }
复制代码
回复 支持 反对

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
地板
发表于 2018-8-24 19:58:13 | 只看该作者
  1. #include<iostream>//n行m列
  2. using namespace std;
  3. int m,n,ans;
  4. int dc[9]= {0,+1,+1,-1,-1,+1,+0,-1,+0};
  5. int dr[9]= {0,+1,-1,+1,-1,+0,+1,+0,-1};
  6. char mp[101][101],s[101][101];
  7. int main()
  8. {
  9.     cin>>n>>m;
  10.     for(int i=1; i<=n; i++)
  11.         for(int j=1; j<=m; j++)
  12.             cin>>mp[i][j];
  13.     for(int i=1; i<=n; i++)
  14.         for(int j=1; j<=m; j++)
  15.         {
  16.             ans=0;
  17.             if(mp[i][j]=='*')s[i][j]='*';
  18.             else
  19.             {
  20.                 for(int k=1; k<=8; k++)
  21.                     if(mp[i+dc[k]][j+dr[k]]=='*')ans++;
  22.                 s[i][j]=ans+'0';
  23.             }
  24.         }
  25.     for(int i=1; i<=n; i++)
  26.     {
  27.         for(int j=1; j<=m; j++)
  28.             cout<<s[i][j];
  29.         cout<<endl;
  30.     }
  31.     return 0;
  32. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-26 13:24 , Processed in 0.101424 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表