首页 > 其他 > 详细

Problem 1920 Left Mouse Button

时间:2014-03-04 16:33:43      阅读:637      评论:0      收藏:0      [点我收藏+]

Accept: 269    Submit: 504
Time Limit: 1000 mSec    Memory Limit : 32768 KB

bubuko.com,布布扣 Problem Description

Mine sweeper is a very popular small game in Windows operating system. The object of the game is to find mines, and mark them out. You mark them by clicking your right mouse button. Then you will place a little flag where you think the mine is. You click your left mouse button to claim a square as not being a mine. If this square is really a mine, it explodes, and you lose. Otherwise, there are two cases. In the first case, a little colored numbers, ranging from 1 to 8, will display on the corresponding square. The number tells you how many mines are adjacent to the square. For example, if you left-clicked a square, and a little 8 appeared, then you would know that this square is surrounded by 8 mines, all 8 of its adjacent squares are mines. In the second case, when you left-click a square whose all adjacent squares are not mines, then all its adjacent squares (8 of its adjacent squares) are mine-free. If some of these adjacent squares also come to the second case, then such deduce can go on. In fact, the computer will help you to finish such deduce process and left-click all mine-free squares in the process. The object of the game is to uncover all of the non-mine squares, without exploding any actual mines. Tom is very interesting in this game. Unfortunately his right mouse button is broken, so he could only use his left mouse button. In order to avoid damage his mouse, he would like to use the minimum number of left clicks to finish mine sweeper. Given the current situation of the mine sweeper, your task is to calculate the minimum number of left clicks.
bubuko.com,布布扣

bubuko.com,布布扣 Input

The first line of the input contains an integer T (T <= 12), indicating the number of cases. Each case begins with a line containing an integer n (5 <= n <= 9), the size of the mine sweeper is n×n. Each of the following n lines contains n characters Mij(1 <= i,j <= n), Mij denotes the status of the square in row i and column j, where ‘@’ denotes mine, ‘0-8’ denotes the number of mines adjacent to the square, specially ‘0’ denotes there are no mines adjacent to the square. We guarantee that the situation of the mine sweeper is valid.

bubuko.com,布布扣 Output

For each test case, print a line containing the test case number (beginning with 1) and the minimum left mouse button clicks to finish the game.

bubuko.com,布布扣 Sample Input

1 9 001@11@10 001111110 001111110 001@22@10 0012@2110 221222011 @@11@112@ 2211111@2 000000111

bubuko.com,布布扣 Sample Output

Case 1: 24

 

解题思路:每次左键按在0位置的可以最大范围的扩大安全区域,
把成块的零区域连起来,外面有一层非零的格子;
再加上未不和零直接相邻的数字格子,就得到了答案。
如例子:零区域有4处,然后,加上剩下的20个格子就是24;

 

#include"stdio.h"
#include"string.h"
#define N 20
char str[N][N];
int mark[N][N],n;
int dir[8][2]={0,1,0,-1,1,0,-1,0,-1,-1,-1,1,1,-1,1,1};        //8个方向
void dfs(int x,int y)
{
	int i,di,dj;
	if(str[x][y]!=‘0‘)            //不是零就返回
		return ;
	for(i=0;i<8;i++)
	{
		di=dir[i][0]+x;
		dj=dir[i][1]+y;
		if(di>=0&&di<n&&dj>=0&&dj<n&&!mark[di][dj])   //搜过的不能再搜,否则会死循环
		{
			mark[di][dj]=1;
			dfs(di,dj);
		}
	}
}
int main()
{
	int i,j,T,ans,cnt=1;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		for(i=0;i<n;i++)
			scanf("%s",str[i]);
		memset(mark,0,sizeof(mark));
		ans=0;
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
				if(mark[i][j]==0&&str[i][j]==‘0‘)      //搜索共有几处0区域并标记
				{
					mark[i][j]=1;
					dfs(i,j);
			    	ans++;
				}
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)         //加上剩余的非零格子
			{
				if(!mark[i][j]&&str[i][j]!=‘@‘)
					ans++;
			}
		printf("Case %d: %d\n",cnt++,ans);
	}
	return 0;
}


 

Problem 1920 Left Mouse Button,布布扣,bubuko.com

Problem 1920 Left Mouse Button

原文:http://blog.csdn.net/u011721440/article/details/20391589

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!