Left Mouse Button (ZCMU暑期提高六)

本文介绍了一种解决经典Windows扫雷游戏的算法实现。通过深度优先搜索(DFS)策略,文章详细阐述了如何使用最少的点击次数来完成游戏的方法。特别关注了仅能使用左键点击的情况,并提供了一个具体的样例输入输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 M ij(1 <= i,j <= n), M ij 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.

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

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

Sample Output

Case 1: 24

 

这个题说半天没啥用的话,

一开始可用bfs,想不通为啥我要用bfs那样代码不就写的慢了么,还好还没写搜索就改成了dfs,写了这么多这种不知道为啥还是一次代码不能过,总出小问题,

 

做题太慢了,感觉别人的思路比我要快,还是得多练

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 20;
int vis[N][N];
char s[N][N];
int u[8][2] = { { 0, 1 },{ 0, -1 },{ 1, 0 },{ -1, 0 },{ 1, -1 },{ 1, 1 },{ -1, -1 },{ -1, 1 } };
int n;
int ca;

void dfs(int x, int y)
{
	
	for (int i = 0; i < 8; i++) {
		int xx = x + u[i][0];
		int yy = y + u[i][1];
		if (xx>=0&&xx<n&&yy>=0&&yy<n&&!vis[xx][yy]&&(s[x][y] == '0')) {
			vis[xx][yy] = 1;
          dfs(xx, yy);
		}
			
	}
}
int main()
{
	int T;
	scanf("%d", &T);
	while (T--) {
		memset(vis, 0, sizeof(vis));
		scanf("%d", &n);
		for (int i = 0;i < n;i++)  scanf("%s", s[i]);
		int flag = 0;
		for (int i = 0;i < n;i++) {
			for (int j = 0;j < n;j++) {
				if (s[i][j] == '0'&&!vis[i][j]) {
					flag++;
					vis[i][j] = 1;
					dfs(i, j);
			
				}
			}
		}
		for (int i = 0;i < n;i++) {
			for (int j = 0;j < n;j++) {
				if (s[i][j] != '@' && !vis[i][j]) flag++;
			}
		}
		printf("Case %d: %d\n", ++ca, flag);
	}

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值