2.扫雷(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

样例输出

【样例输出1】
GAME OVER!

【样例输出2】
-1 -1 0 0 0 0
-1 -1 -2 -1 -1 0
1 0 -1 -1 -2 0
0 0 -1 -1 -1 -1
0 1 0 -1 -1 -2
0 0 0 -1 -1 -1
正解
模拟,按照题意模拟即可AC
AC代码

#include<iostream>
#include<cstdio>
using namespace std;
int n,o,x,y,k,a[105][105];
void pd(int x,int y)
{
   
	if(a[x][y]==0)a[x][y]=-1;//不是雷就标记-1
	if(a[x][y]==1){
   a[x][y]=-2;o--;}//是雷就标记-2,雷的个数减1
}
int main()
{
   
	//freopen("mine.in","r",stdin);
	//freopen("mine.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=n;j++)
	  {
   
	  	cin>>a[i][j];//输入
	  	if(a[i][j]==1)o++;//找出有多少个累
	  }
	while(1)
	{
   
		cin>>x>>y;
		if(x==0&&y==0){
   k=1;break;}//如果既没有胜利,也没有失败,就输出处理过后的情况
		if(a[x][y]==0)
		//如果不是雷,也没有处理过,就处理一个9宫格(如下图)
		| x-1,y-1 | x-1,y | x-1,y+1 |
		|  x,y-1  |  x,y  |  x,y+1  |
		| x+1,y-1 | x+1,y | x+1,y+1 |
		{
   
			pd(x-1,y-1);pd(x-1,y);pd(x-1,y+1);
			pd(x,y-1);pd(x,y);pd(x,y+1);
			pd(x+1,y-1);pd(x+1,y);pd(x+1,y+1);
		}	
		if(a[x][y]==1){
   cout<<"GAME OVER!";break;}//如果踩到没有处理过的雷,就失败
		if(o==0){
   cout<<"YOU ARE WINNER!";break;}//如果雷全部被排完,就胜利
	}  
	if(k==1)
	 for(int i=1;i<=n;i++)//处理过后的情况
	  for(int j=1;j<=n;j++)
	   if(j!=n)cout<<a[i][j]<<' ';
	    else cout<<a[i][j]<<endl;
	return 0;
}

下面附本次比赛的其它题目

2020.02.29模拟赛11(第一题)
2020.02.29模拟赛11(第二题)
2020.02.29模拟赛11(第三题)
2020.02.29模拟赛11(第四题)
2020.02.29模拟赛11(第五题)
2020.02.29模拟赛11(总结)

谢谢观看