1. 程式人生 > >FZU1920 Left Mouse Button(dfs)

FZU1920 Left Mouse Button(dfs)

char only object itl cati algorithm square 操作數 ring

技術分享 Problem 1920 Left Mouse Button

Accept: 385 Submit: 719
Time Limit: 1000 mSec Memory Limit : 32768 KB

技術分享 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.
技術分享

技術分享 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 [email protected] 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.

技術分享 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.

技術分享
Sample Input

[email protected]@[email protected]@[email protected]@@[email protected]@[email protected]

技術分享 Sample Output

Case 1: 24


題目鏈接:點擊打開鏈接

掃雷遊戲, 給出當前地圖, @代表地雷, 數字代表地圖中點周圍的地雷數, 問最少操作數是多少.

由於操作數要最少, 所以要從0的點開始dfs, 每一次操作都能夠確定周圍8個方向的地雷數情況, 最後再加上沒訪問且不是地雷的點就可以.

AC代碼:

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "queue"
#include "stack"
#include "cmath"
#include "utility"
#include "map"
#include "set"
#include "vector"
#include "list"
#include "string"
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int MAXN = 10;
int n, dir[8][2] = {{0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}, {-1, 0}, {-1, 1}};
char s[MAXN][MAXN];
void dfs(int x, int y)
{
	s[x][y] = '$';
	for(int i = 0; i < 8; ++i) {
		int a = x + dir[i][0];
		int b = y + dir[i][1];
		if(a < 0 || a >= n || b < 0 || b >= n) continue;
		if(s[a][b] == '0') dfs(a, b);
		if(s[a][b] != '@' && s[a][b] != '$') s[a][b] = '$';
	}
}
int main(int argc, char const *argv[])
{
	int t;
	scanf("%d", &t);
	for(int cas = 1; cas <= t; ++cas) {
		int ans = 0;
		scanf("%d", &n);
		for(int i = 0; i < n; ++i)
			scanf("%s", s[i]);
		for(int i = 0; i < n; ++i)
			for(int j = 0; j < n; ++j)
				if(s[i][j] == '0') {
					dfs(i, j);
					ans++;
				}
		for(int i = 0; i < n; ++i)
			for(int j = 0; j < n; ++j)
				if(s[i][j] != '@' && s[i][j] != '$') ans++;
		printf("Case %d: %d\n", cas, ans);
	}
	return 0;
}


FZU1920 Left Mouse Button(dfs)