• FZU1920 Left Mouse Button(dfs)


     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 ‘@’ 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

    19001@11@10001111110001111110001@22@100012@2110221222011@@11@112@2211111@2000000111

     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
    ", cas, ans);
    	}
    	return 0;
    }


  • 相关阅读:
    SQL Server数据库查询区分大小写、全半角——排序规则的应用
    C#中查询字符串中是否包含指定字符/字符串,使用IndexOf还是Contains?
    【WM6.5】三星I8000按键码及窗体消息发送的方法备忘
    UoBlog 支持 MetaWeblog Api,可以使用 Windows Live Writer 离线发表日志
    C#中如何获取一个字符串的实际字符数
    使用HttpWebRequest发送HTTP请求,同时支持GET/POST方式提交。
    c#.NET中开发可用于Web网页的ActiveX控件
    CorePlex开发手记:一、Winform窗体皮肤及简单换肤机制
    .NET中简易实现线程安全
    在C#中截取指定长度的中文字符串(效率提高2500倍)
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7290459.html
Copyright © 2020-2023  润新知