zoukankan      html  css  js  c++  java
  • 扫雷

    题目描述:

    扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。
    现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。
    注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。

    输入:

    输入文件第一行是用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数。
    接下来n行,每行m个字符,描述了雷区中的地雷分布情况。字符’*’表示相应格子是地雷格,字符’?’表示相应格子是非地雷格。相邻字符之间无分隔符。

    输出:

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

    样例输入:

    example#1
    3 3
    ??
    ???
    ?
    ?

    example#2
    2 3
    ?*?
    *??

     

    样例输出:

    example#1
    *10
    221
    1*1

    example#2
    2*1
    *21

     

    数据范围:

    对于 100%的数据, 1≤n≤100, 1≤m≤100

     

    一定要注意进入数组的数是从第0位开始的,要不定义的时候就是dx[9]={0,……},下面的方向for循环中从1开始循环;要不就是dx[8]然后正常写八个方向,然后下面的for里从第0位开始(这个地方debug了3天愣是没看出来/(ㄒoㄒ)/~~)。所以大家一定要注意哈!!!

     

    DFS代码:

    #include<iostream>
    #include<cstdio>
    #define BY ZHOIER
    using namespace std;
    int dx[8]={-1,-1,0,1,1,1,0,-1},dy[8]={0,1,1,1,0,-1,-1,-1};
    int m,n;
    int k[1005][1005]={0};
    char map[1005][1005];
    void zxy(int x,int y)//zxy函数
    {
        for(int i=0;i<8;i++)//8个方向
        {
            int newx=x+dx[i],newy=y+dy[i];//定义新的坐标
            if(newx>=1&&newx<=n&&newy>=1&&newy<=m)//判断是否出界
                k[newx][newy]++;
        }
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
                cin>>map[i][j];
                if(map[i][j]=='*')//如果是雷就执行zxy函数
                    zxy(i,j);
            }
        for(int i=1;i<=n;i++)
            {
            for(int j=1;j<=m;j++)
                if(map[i][j]=='*')//是就输出原来定义的字符图
                cout<<map[i][j];
                else//不是就输出执行完zxy的k图
                cout<<k[i][j];
                cout<<endl;
            }
        return 0;
    }

    当然,可以不用DFS也可以:

    #include <iostream>
    using namespace std;
    int main()
    {
    int n,m,cnt=0;
    char a[102][102];
    char b[102][102];
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    cin>>a[i][j];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(a[i][j]!='*')
            {
                if(a[i-1][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][j+1]=='*') cnt++;
                if(a[i+1][j-1]=='*') cnt++;
                if(a[i+1][j]=='*') cnt++;
                if(a[i+1][j+1]=='*') cnt++;
                cout<<cnt;
                cnt=0;
            }
        else cout<<"*";
        }
    cout<<endl;
    }
    return 0;
    }
  • 相关阅读:
    【记录】【MySQL】填充字符串函数 LPAD(str,len,padstr)
    nvm安装node和npm,个人踩坑记录
    win10系统下cmd输入一下安装的软件命令提示拒绝访问解决办法
    bootstrap大图轮播手机端不能手指滑动解决办法
    JS中函数声明与函数表达式的异同
    javaScript实现归并排序
    js插入节点appendChild和insertBefore
    JS的事件冒泡和事件捕获
    js 停止事件冒泡 阻止浏览器的默认行为
    事件绑定的几种常见方式
  • 原文地址:https://www.cnblogs.com/Zhoier-Zxy/p/8067124.html
Copyright © 2011-2022 走看看