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

最新文章

  1. Redis命令拾遗一(字符串类型)
  2. [flex布局]-flex教程
  3. Mybatis获取插入记录的自增长ID(转)
  4. 2013第46周四xml作为WS两端中间测试文件
  5. OAuth2.0开发指南
  6. php_json入库有关
  7. android版本 busybox
  8. JS调用WebService,发布到IIS,网页提示WebService未定义[已解决]
  9. Python__slots__详解
  10. elasticsearch5之Elastalert 安装使用 配置邮件报警和微信报警
  11. SPOJ DQUERY D-query(主席树 区间不同数个数)
  12. 页面中dropDownListt的二级关联
  13. 手动搭建Docker本地私有镜像仓库
  14. jeb 下载
  15. centos下安装docker,kubelet kubeadm kubectl
  16. report studio 交叉表占比
  17. HTML+CSS网站开发兵书
  18. sqlplus column命令用法
  19. COCOS2D-HTML5 开发之二】cocos2d-html5项目定义成员,局部变量,函数笔记随笔
  20. 对PHP输入输出流学习和认识

热门文章

  1. Arduino可穿戴开发入门教程LilyPad和LilyPad Simple的介绍
  2. Sd - Hibernate
  3. POJ 2960 S-Nim 博弈论 sg函数
  4. 【线性筛】【质因数分解】【约数个数定理】hdu6069 Counting Divisors
  5. 数据库系统入门 | Oracle Linux上部署Oracle 11g服务,并实现SSH远程登录管理
  6. trim()函数 mysql中的强大字符串过滤函数
  7. 将WPF版的弹幕播放器给优化了一下
  8. Java并发包之闭锁/栅栏/信号量
  9. 使用Hexo快速搭建一个博客,并部署到github
  10. Android-25种开源炫酷动画框架