H106OJ第三次练习:扫雷
提示:本文章为课程任务(学习记录)
问题描述
题目:
扫雷游戏你一定玩过吧!现在给你若干个n×m的地雷阵,请你计算出每个矩阵中每个单元格相邻单元格内地雷的个数,每个单元格最多有8个相邻的单元格。 0<n,m<=100
输入:
输入包含若干个矩阵,对于每个矩阵,第一行包含两个整数n和m,分别表示这个矩阵的行数和列数。接下来n行每行包含m个字符。安全区域用‘.’表示,有地雷区域用’*‘表示。当n=m=0时输入结束。
输出:
对于第i个矩阵,首先在单独的一行里打印序号:“Field #i:”,接下来的n行中,读入的’.'应被该位置周围的地雷数所代替。输出的每两个矩阵必须用一个空行隔开。
(注意两个矩阵之间应该有一个空行,由于oj的格式化这里不能显示出来)
样例:
输入:
4 4
…
…
.…
…
3 5
**…
…
.*…
0 0
输出:
Field #1:
100
2210
110
1110
Field #2:
**100
33200
1*100
思路:
对于此题的矩阵,首先想到了用二维数组,其次我觉得只要将判别各个方向有没有地雷的算法写出其他都简单了,对于找地雷的算法,将ch[i][j]看做一个基点,然后从挨着他的八个方向去找,此段代码如下:
for(int k = i - 1; k <= i + 1; k++)
{
for(int l = j - 1 ; l <= j + 1 ; l++)
{
if(ch[k][l] == '*'&& k>=0 && k<m && l>=0 && l<n)
count++;
}
}
最后总代码为:
代码:
#include<bits/stdc++.h>
using namespace std;
char ch[100][100];
int main() {
int m, n, time = 1;
cin>>m>>n;
memset(ch,'0',sizeof(ch));
while(m!=0&&n!=0)
{
for(int i= 0 ;i < m ; i++)
{
for(int j = 0 ; j < n ; j++)
{
cin>>ch[i][j];
}
}
cout<<"Field #"<<time<<":"<<endl;
for(int i= 0 ;i < m ; i++)
{
for(int j = 0 ; j < n ; j++)
{
int count = 0;
if(ch[i][j]=='*')
{
cout<<ch[i][j];
continue;
}
else
{
for(int k = i - 1; k <= i + 1; k++)
{
for(int l = j - 1 ; l <= j + 1 ; l++)
{
if(ch[k][l] == '*'&& k>=0 && k<m && l>=0 && l<n)
count++;
}
}
}
cout<<count;
}
cout<<endl;
}
cout<<endl;
cin>>m>>n;
time++;
}
return 0;
}