挑战编程题目2(Minesweeper)附源…

本文介绍了一种经典的扫雷游戏实现算法,通过输入不同大小的游戏矩阵来找出所有地雷的位置。文章详细解释了如何根据周围地雷数量提示来判断每个格子的状态,并提供了一个具体的4x4游戏实例进行说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Have you ever played Minesweeper? This cute little game comes with a certain operating system whose name we can't remember. The goal of the game is to find where all the mines are located within a M x N field.

The game shows a number in a square which tells you how many mines there are adjacent to that square. Each square has at most eight adjacent squares. The 4 x 4 field on the left contains two mines, each represented by a ``*'' character. If we represent the same field by the hint numbers described above, we end up with the field on the right:

*...
....
.*..
....

*100
2210
1*10
1110

Input

The input will consist of an arbitrary number of fields. The first line of each field contains two integers n and m ( 0 < n, m$ \le$100) which stand for the number of lines and columns of the field, respectively. Each of the next n lines contains exactly m characters, representing the field.

Safe squares are denoted by ``.'' and mine squares by ``*,'' both without the quotes. The first field line where n = m = 0 represents the end of input and should not be processed.

Output

For each field, print the message Field #x: on a line alone, where x stands for the number of the field starting from 1. The next n lines should contain the field with the ``.'' characters replaced by the number of mines adjacent to that square. There must be an empty line between field outputs.

Sample Input

4 4
*...
....
.*..
....
3 5
**...
.....
.*...
0 0

Sample Output

Field #1:
*100
2210
1*10
1110

Field #2:
**100
33200
1*100

源码:
#include<stdio.h>

int main()
{
    int i,j,n,m;
    scanf("%d %d\n",&n,&m);
    char ch[n][m];
    int num[n][m];
    int count=1;
    while(n!=0 || m!=0)
    {
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
                scanf("%c",&ch[i][j]);
            getchar();//换行符
        }
        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
                num[i][j]=0;//初始化一下
        printf("\nField #%d\n",count);
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if(ch[i][j]=='*')
                    putchar('*');
                else
                {
                    if(i-1>-1&& j-1>-1 && ch[i-1][j-1]=='*')
                        num[i][j]++;   
                    if(i-1>-1 && ch[i-1][j]=='*')
                        num[i][j]++;   
                    if(i-1>-1 && j+1<m && ch[i-1][j+1]=='*')
                        num[i][j]++;   
                    if(j-1>-1 && ch[i][j-1]=='*')
                        num[i][j]++;
                    if(j+1<m && ch[i][j+1]=='*')
                        num[i][j]++;   
                    if(i+1<n && j-1>-1 && ch[i+1][j-1]=='*')
                        num[i][j]++;   
                    if(i+1<n && ch[i+1][j]=='*')
                        num[i][j]++;   
                    if(i+1<n && j+1<m && ch[i+1][j+1]=='*')
                        num[i][j]++;       
                    printf("%d",num[i][j]);
                }
            }
            printf("\n\n");//换行符
        }
        count++;
        scanf("%d %d\n",&n,&m);
           
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值