【15NOIP普及组】扫雷游戏

题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1970

洛谷地址:https://www.luogu.com.cn/problem/P2670

本题的难点,1、是字符及字符串的出入输出  2、四个方向的遍历

方法一:有BUG

#include<bits/stdc++.h>
using namespace std;
int n,m,cnt;
char a[111][111];
int main()
{
    cin>>m>>n;
    getchar();
    for(int i=0;i<m;i++)
    {
        cin.getline(a[i],111);
    }
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            cnt=0;
            if(a[i][j]=='*')cout<<'*';
            else if(a[i][j]=='?')
            {
                if(a[i][j+1]=='*')cnt++;
                if(a[i+1][j]=='*')cnt++;
                if(a[i+1][j+1]=='*')cnt++;
                if(a[i][j-1]=='*')cnt++;
                if(a[i-1][j-1]=='*')cnt++;
                if(a[i-1][j]=='*')cnt++;
                if(a[i-1][j+1]=='*')cnt++;
                if(a[i+1][j-1]=='*')cnt++;
                cout<<cnt;
            }
        }
        cout<<endl;
    }
    return 0;
}

方法二:

#include<bits/stdc++.h>
using namespace std;
int n, m;
char a[105][105];
int dx[8]= {-1, 1,  0, 0, -1, -1,  1,  1};//依次对应上、下、左、右、左上、右上、左下、右下八个方向 的x坐标变化差值 
int dy[8]= { 0, 0, -1, 1, -1,  1, -1,  1};//依次对应上、下、左、右、左上、右上、左下、右下八个方向 的y坐标变化差值
int main() {
    cin>>n>>m;
    getchar();//过滤掉输入m后的换行字符
    for(int i=0; i<n; i++) {
        for(int j=0; j<m; j++)
            a[i][j]=getchar();
        getchar();//过滤每行的换行字符
    }

    //二维数组输入一定要测试输入是否正确
//    for(int i=0; i<n; i++) {
//        for(int j=0; j<m; j++)
//            cout<<a[i][j];
//        cout<<endl;
//    }

    for(int i=0; i<n; i++) {
        for(int j=0; j<m; j++) {
            int cnt=0;//统计每个坐标点周边*的数量 ,初始化为0 
            for(int k=0; k<8; k++) {//循环遍历坐标点8个方向 
                int nx=i+dx[k];
                int ny=j+dy[k];
                if(nx < 0 || nx > n-1 && ny < 0 && ny > m-1)continue;//如果越界,则判断下一个方向 
                if(a[nx][ny]=='*')cnt++;//如果周边有*则把cnt累加1 
            }
            if(a[i][j]=='*')//如果该点为*则输出* 
                cout<<'*';
            else//否则输出周边*数 
                cout<<cnt;
        }
        cout<<endl;
    }
    return 0;
}

 更多题解:http://8.142.64.55:8888/discuss/621b36803a3357268ae08e7e#1645972175251

posted @ 2022-02-27 22:41  TFLSNOI  阅读(128)  评论(0编辑  收藏  举报