扫雷(mine)

扫雷(mine)

题目描述:

Windows中的扫雷游戏是大家都熟悉的小游戏,今天,味味也设计了一个简易的扫雷游戏。味味设计的扫雷游戏功能如下:
一、程序一开始会读入扫雷区域大小n,表示游戏区域有n*n个小方格组成,接下来会读入n行信息,每行有n个整数(每个整数可能是0,也可能是1),每两个整数之间用一个空格分隔。其中0 所在位置表示该小方格内没有地雷,1 所在位置表示该小方格内有地雷(游戏开始时,扫雷区域中必定包含至少一个地雷)。接下来每行输入两个用空格分开的正整数i和j,每一行的一对i和j表示用户用鼠标单击扫雷区域中第i 行第j 列位置上的小方格(就象我们使用Windows 中扫雷游戏一样),i 和j 表示的位置必定在扫雷区域内。程序每输入一对i和j,就马上进行相应的处理(就象我们在Windows 中鼠标单击某个小方块就会出现结果一样)。
二、程序将根据读入的一组i 和j的值来对扫雷区域作相应处理,具体的处理规则如下:
在这里插入图片描述
(1)如果i和j 表示的小方格内没有地雷、而且也没有被处理过(就是第i行第j 列的数值是0),那么将以该小方格为中心的一个正方形区域内所有没有地雷的小方格都赋值为-1(表示该区域的地砖已经被掀开了)。如果在当前正方形区域内有一个位置号为i1和j1(注意:i1<>i并且j1<>j)的小方格内恰好有地雷,则此地雷就被顺利扫除,将该位置标记为-2。如果该正方形区域内某些小方格已经被处理过,则对这些小方格不再做任何处理。举个例子来说明一下,假如输入信息如上图左边所示,那么处理结果就如右边所示。
(2)如果i 和j 表示的小方格已经被处理过(就是第i 行第j 列的数值是-1 或者是-2),那么不作任何处理,继续去读取下一行的i和j 的值。
(3)如果i和j 表示的小方格刚好有地雷,并且该小方格没有被处理过(就是第i 行第j 列的数值是1),那么表示用户触雷,马上输出信息“GAME OVER!”,程序结束。
三、如果在读入i和j的过程中一直没有触雷,那么就一直按照位置信息处理下去,直到满足下列条件之一,就输出相应信息并结束程序:
(1)读入的i和j的值都是0(表示用户不再在某个小方格内单击鼠标右键了),则输出处理后整个扫雷区域的状态(就是输出n行n列的方阵,每行中两个整数之间用一个空格分隔,末尾没有多余空格),然后程序结束。
(2)如果某次处理完后,游戏区域内所有的地雷都被扫除了,那么不必再读入下一行的信息,输出信息“YOU ARE WINNER!”,程序结束。

输入

输入文件名为mine.in。第一行一个整数n(n<=50),接下来是一个n*n 的方阵。再接下来是若干行,每行空格分隔的两个整数,表示i和j,以0 0结束。

输出

输出文件名为mine.out。包含一行,可能输出“YOU ARE WINNER!”,可能输出“GAME OVER!”,
也可能输出一个处理后的方阵。

样例输入

【样例输入1】

6
0 0 0 0 0 0
0 0 1 0 0 0
1 0 0 0 1 0
0 0 0 0 0 0
0 1 0 0 0 1
0 0 0 0 0 0
1 1
3 4
5 5
4 6
5 2
2 3
0 0

【样例输入2】

6
0 0 0 0 0 0
0 0 1 0 0 0
1 0 0 0 1 0
0 0 0 0 0 0
0 1 0 0 0 1
0 0 0 0 0 0
1 1
3 4
5 5
4 6
2 3
0 0

题目好长啊——,化简一下
题目大意:

给你一个n*n的方阵,对于他输入的(i,j)叫你去进行扫雷
扫雷的规则如下:
一:当前这个格子没有被处理过

扫描二维码关注公众号,回复: 10016388 查看本文章
  1. 不是地雷,则为中心这个格子的一个正方形区域,是地雷变
    为-2,不是则变为-1
  2. 是地雷,则直接输出“GAME OVER!”
    二:当前这个格子被处理过
    跳过,无视!

最后如果所有的地雷都被扫除,则输出“YOU ARE WINNER!”

理解了题意,我们便来分析:

没有被处理过:
是地雷没什么好说的,输出就行了
不是地雷,则将它的左上角和右上角,左下角和右下角,上下左右,是地雷
赋为-2,不是则-1

如何判断他已近扫完了所有地雷?

一开始我们在输入时就边记录地雷的个数,以后扫到地雷就将它–,最后
只要判断他是否等于0,就行了!

code:

#include<cstdio>
#include<iostream>
using namespace std;
int x,y,n,map[51][51];
int dx[9]={0,-1,-1,-1,0,0,1,1,1};
int dy[9]={0,-1,0,1,-1,1,-1,0,1};
int main()
{
	freopen("mine.in","r",stdin);
	freopen("mine.out","w",stdout);
	int s=0;
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
		for (int j=1;j<=n;j++)
    	{
			scanf("%d",&map[i][j]);
			if(map[i][j]==1) s++;
		}
	}
	while (1)
    {
    	scanf("%d %d",&x,&y);
        if (x==0&&y==0) break;
		if (map[x][y]==1) 
        {
            printf("GAME OVER!");
            return 0;
        }
        else if (map[x][y]>=0) 
        for (int i=0;i<9;i++) 
        {
            int tx=x+dx[i],ty=y+dy[i]; 
            if (tx>0&&ty>0&&tx<=n&&ty<=n&&map[tx][ty]>=0) 
            {
                if (map[tx][ty]==0) map[tx][ty]=-1; 
                else map[tx][ty]=-2,s--; 
            }
        }
        if (s==0) 
        {
            printf("YOU ARE WINNER!");
            return 0;
        }
    }
    for (int i=1;i<=n;i++) 
    {
    	printf("%d",map[i][1]);
        for (int j=2;j<=n;j++)
        	printf(" %d",map[i][j]); 
        printf("\n");
    }
    return 0;
}

不懂请在评论区留言!

发布了104 篇原创文章 · 获赞 74 · 访问量 4024

猜你喜欢

转载自blog.csdn.net/bigwinner888/article/details/104601847
今日推荐