【jzoj2172】扫雷

题目描述

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

解题思路

暴力模拟 😐


#include<iostream>
#include<cstdio>
using namespace std;
int n,a[100][100],Gun,x,y;
int main(){
	freopen("mine.in","r",stdin);
	freopen("mine.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=n;j++){
	    	scanf("%d",&a[i][j]);
	    	Gun+=a[i][j];
	    }
	while(scanf("%d%d",&x,&y)&&x){
		if(a[x][y]>0){//点到雷了
			printf("GAME OVER!");
			return 0;
		}
		if(a[x][y]<0)//已经做过
		   continue;
		for(int i=max(x-1,1);i<=min(x+1,n);i++)
		    for(int j=max(y-1,1);j<=min(y+1,n);j++)
		        if(a[i][j]==1)a[i][j]=-2,Gun--;
		           else if(a[i][j]==0)a[i][j]=-1; 
		if(Gun==0){
			printf("YOU ARE WINNER!");
			return 0;
		}
	}
	for(int i=1;i<=n;i++){
	    for(int j=1;j<=n;j++)
	        printf("%d ",a[i][j]);
	    printf("\n");
	}
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值