P2690 扫雷游戏

P2690  扫雷游戏(此为超链接)

 

 

扫雷游戏非常经典解压,通过观察多个数字,最终判断雷的位置。

(图为扫雷游戏)

本题目要求将非雷格周围的雷用数字写出;需要先定义二维字符数组(我也不知道怎么叫);运用循环将其输入,进行判断,然后输出结果。

代码如下:

扫描二维码关注公众号,回复: 8956281 查看本文章

 

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int main()
 5 {
 6     int m,n;
 7     char a[101][101];//定义二维字符数组 
 8     cin>>n>>m;
 9     for(int i=0;i<n;i++)
10     {
11         for(int j=0;j<m;j++)
12         {
13             cin>>a[i][j]; //通过循环输入 
14         }
15     }    
16     for(int i=0;i<n;i++)
17     {
18         for(int j=0;j<m;j++)
19         {
20             int sum=48;
21             if(a[i][j]!='*') 
22             {
23             /*若为雷,则保持不变。若不为雷,则对周围雷数进行判断*/ 
24             if(a[i][j]=='?')
25             a[i][j]='0';//若a[i][j]周围无雷,则输出"0" 
26             if(a[i-1][j-1]=='*')
27             {
28                 a[i][j]=sum+1;
29                 sum++;
30             }
31             if(a[i-1][j]=='*')
32             {
33                 a[i][j]=sum+1;
34                 sum++;
35             }
36             if(a[i-1][j+1]=='*')
37             {
38                 a[i][j]=sum+1;
39                 sum++;
40             }
41             if(a[i][j-1]=='*')
42             {
43                 a[i][j]=sum+1;
44                 sum++;
45             }
46             if(a[i][j+1]=='*')
47             {
48                 a[i][j]=sum+1;
49                 sum++;
50             }
51             if(a[i+1][j-1]=='*')
52             {
53                 a[i][j]=sum+1;
54                 sum++;
55             }
56             if(a[i+1][j]=='*')
57             {
58                 a[i][j]=sum+1;
59                 sum++;
60             }
61             if(a[i+1][j+1]=='*')
62             {
63                 a[i][j]=sum+1;
64                 sum++;
65             }}
66         }
67     }
68     for(int i=0;i<n;i++)
69     {
70         for(int j=0;j<m;j++)
71             cout<<a[i][j];//将结果输出 
72         cout<<endl;
73     }     
74     return 0; //return 0;好习惯 
75 }

 

 

 也可以通过判断雷的位置,将其周围的8个格(雷除外)全部+1,再输出答案;具体代码如下:

#include<iostream>
using namespace std;
int main()
{
    char a[101][101];
    int b[101][101],n,m,i,j;//数组定义(二维)
    cin>>n>>m;//读入行、列
    for(i=0;i<101;i++)
        for(j=0;j<101;j++)
            b[i][j]=0;//给数组赋值为0
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
        {
            cin>>a[i][j];
            if(a[i][j]=='*')//判断:如果是地雷
            {
                b[i+1][j+1]++;
                b[i+1][j-1]++;
                b[i+1][j]++;
                b[i][j+1]++;
                b[i][j-1]++;
                b[i-1][j]++;
                b[i-1][j+1]++;
                b[i-1][j-1]++;//相邻的八个格子都+1                
            }
        }
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            if(a[i][j]=='*')
                cout<<"*";//如果是地雷(*) 原样输出
            else
                cout<<b[i][j];//否则输出数字
        }    
        cout<<endl;
    }
}


总结一下:本题考查字符串的知识,我考虑了两种情况(找无雷判断周围;找有雷周围加一),在相同的题目,会有不同的做法,从而写出时间复杂度不同的代码(本题都是O(n^2))再今后刷题再到比赛时,需要有这种变通与发散思维。
 

猜你喜欢

转载自www.cnblogs.com/Kyriech-Francis/p/12244637.html
今日推荐