Problem

Minesweeper is a computer game that became popular in the 1980s, and is still included in some versions of the Microsoft Windows operating system. This problem has a similar idea, but it does not assume
you have played Minesweeper.

In this problem, you are playing a game on a grid of identical cells. The content of each cell is initially hidden. There are M mines hidden in M different cells of the grid. No other cells contain mines.
You may click on any cell to reveal it. If the revealed cell contains a mine, then the game is over, and you lose. Otherwise, the revealed cell will contain a digit between 0 and 8, inclusive, which corresponds to the number of neighboring cells that contain
mines. Two cells are neighbors if they share a corner or an edge. Additionally, if the revealed cell contains a 0, then all of the neighbors of the revealed cell are automatically revealed as well, recursively. When all the cells that don't contain mines have
been revealed, the game ends, and you win.

For example, an initial configuration of the board may look like this ('*' denotes a mine, and 'c' is the first clicked cell):

*..*...**.
....*.....
..c..*....
........*.
..........

There are no mines adjacent to the clicked cell, so when it is revealed, it becomes a 0, and its 8 adjacent cells are revealed as well. This process continues, resulting in the following board:

*..*...**.
1112*.....
00012*....
00001111*.
00000001..

At this point, there are still un-revealed cells that do not contain mines (denoted by '.' characters), so the player has to click again in order to continue the game.

You want to win the game as quickly as possible. You want to find the minimum number of clicks to win the game. Given the size of the board (N x N), output such minimum number of clicks.

Input

The first line of the input gives the number of test cases, T. Ttest cases follow. First line of each test case contains one integer N. N lines strings with length N follows
containing '*' and '.', denotes the Minesweeper initial board.

Output

For each test case, output one line containing "Case #x: y", where x is the test case number (starting from 1) and y is the minimum number of clicks to win.

Limits

1 ≤ T ≤ 100.

Small dataset

1 ≤ N ≤ 50.

Large dataset

1 ≤ N ≤ 300.

思路:简单地说就是给出一个扫雷地图,算出最少点击次数。使得全部非地雷区被訪问过。须要一个数组存每一个位置周围地雷数目。点击到地雷数为0的时候将自己主动訪问呢周围八个区域,并且会递归訪问0的区域。

所以解题方法事实上就仅仅要是须要深搜。先将地雷数为0的訪问,然后深搜訪问。到最后再訪问那些非地雷非0的区域,就能实现最少点击。

代码:

/*2014-10-16 for google graduates online test
*author:zhuangweibiao
*/
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
string str[302];//存扫雷矩阵
int num[302][302];
bool visit[302][302];
void dfs(int i, int j, int n)
{
visit[i][j] = true;
for(int ii = i - 1; ii <= i + 1; ii++)
for(int jj = j - 1; jj <= j + 1; jj++)
{
if(ii >= 0 && ii < n && jj >= 0 && jj < n && str[ii][jj] != '*' && !visit[ii][jj])
{
if(num[ii][jj] != 0)
visit[ii][jj] = true;
else
dfs(ii, jj, n);
}
}
}
int main()
{
ifstream ifile("A-large-practice (1).in");
ofstream ofile("a2.txt");
int T;
ifile >> T;
for(int i = 1; i <= T; i++)
{
int n;
ifile >> n;
for(int j = 0; j < n; j++)
ifile >> str[j];
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
if(str[i][j] != '*')
{
int count = 0;
for(int ii = i - 1; ii <= i + 1; ii++)
for(int jj =j - 1; jj <= j + 1; jj++)
{
if(ii >= 0 && ii < n && jj >= 0 && jj < n && str[ii][jj] == '*')
count++;
}
num[i][j] = count;
}
else
num[i][j] = -1;
visit[i][j] = false;
}
int count = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
if(num[i][j] == 0 && !visit[i][j])
{
dfs(i, j, n);
count++;
}
}
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
if(str[i][j] != '*' && !visit[i][j])
count++;
}
ofile << "Case #" << i << ": " << count << endl;
}
return 0;
}

Google2015校招在线測试题1----扫雷最少点击次数的更多相关文章

  1. google校招在线測试题---2048

    先附代码:(简单地说就是给出一个矩阵代表2048游戏的一个状态以及一个方向,输出往这个方向移动之后的矩阵) #include<iostream> #include<fstream&g ...

  2. 【hihocoder】1237 : Farthest Point 微软2016校招在线笔试题

    题目:给定一个圆,要你求出一个在里面或者在边上的整数点,使得这个点到原点的距离最大,如果有多个相同,输出x最大,再输出y最大. 思路:对于一个圆,里面整点个数的x是能确定的.你找到x的上下界就可以了. ...

  3. (各个公司面试原题)在线做了一套CC++综合測试题,也来測一下你的水平吧(二)

    刚才把最后的10道题又看了下.也发上来吧. 以下给出试题.和我对题目的一些理解 前10道题地址 (各个公司面试原题)在线做了一套CC++综合測试题.也来測一下你的水平吧(一) 11.设已经有A,B,C ...

  4. 当当网-前端project师測试题

                                     前端project师測试题(笔试时间20分钟.面试时间20分钟)   一.笔试 1.基础问题 (1)前端页面有哪三层构成,各自是什么? ...

  5. jsfiddle在线測试Html、CSS、JavaScript——http://jsfiddle.net/

    jsfiddle在线測试Html.CSS.JavaScript,并展示測试结果 1.选择jQuery1.9.1 2.选择jQuery UI 1.9.2 3.Html <ul id="n ...

  6. 阿里腾讯校招Java面试题总结及答案

    阿里校招java面试题汇总 1.HashMap和HashTable的区别,及其实现原理. Hashtable继承自Dictionary类,而HashMap是Java1.2引进的,继承自Abstract ...

  7. Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

    剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...

  8. 2015网易校招Java开发工程师(技术架构)在线笔试题

    1.  程序和进程的本质区别是? A.在外存和内存存储 B.非顺序和顺序执行机器指令 C.独占使用和分时使用计算机资源 D.静态和动态特征 参考答案分析: 进程与应用程序的区别: 进程(Process ...

  9. 2015年网易校招Java开发工程师(技术架构)在线笔试题

    1.  程序和进程的本质区别是? A.在外存和内存存储 B.非顺序和顺序执行机器指令 C.独占使用和分时使用计算机资源 D.静态和动态特征 参考答案分析: 进程与应用程序的区别: 进程(Process ...

随机推荐

  1. LR接口测试---Java Vuser之增删改查

    import lrapi.lr; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared ...

  2. MySQL 帮助类 MySQLHelper

    /// <summary> /// MySqlHelper操作类 /// </summary> public sealed partial class MySQLHelper ...

  3. HTML5 页面调用微信接口

    参考微信微信官方文档JS_SDK:https://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#JSSDK.E4.BD.B ...

  4. Redis应用场景[分享]

    Redis应用场景[分享] 1.取最新N个数据的操作2.排行榜应用 取TOPN操作3.需要精确设定过期时间的应用4.计数器应用(文章阅读数.评论数)5.Uniq操作,获取某段时间所有数据排重值6.实时 ...

  5. UIPageViewController 翻页、新手引导--UIScrollView:pagingEnabled

    UIPageViewController 翻页.新手引导--UIScrollView:pagingEnabled

  6. vue+axios上传文件

    单独上传文件: <input class="file" name="file" type="file" accept="im ...

  7. 视频剪辑生成gif格式(php外挂python程序)完美!

    接到朋友的需求,朋友是做php的,让我帮忙处理php生成gif的需求.他的项目类似抖音短视频那种,就是展示出来的界面是gif动图,然后点进去是完整的视频. 我想了想,我倒是没做过php生成gif的需求 ...

  8. replace、replaceAll、replaceFirst

    replace.replaceAll.replaceFirst这三个函数会java的同学估计都用过,笔者已经用了2年多,可是,我们真的懂他们吗? 概述一下他们三个的用法: · replace(Char ...

  9. javaScript--进阶1--数据类型、操作符

    一.JS基础知识背景 1.1 弱类型脚本语言 脚本语言是:弥补编译语言的不足而存在的,作为补充语言,不用编译,解析一行执行一行. 弱类型语言:简单理解定义一个变量,可以有多种数据类型.(var tem ...

  10. 洛谷——P1549 棋盘问题(2)

    P1549 棋盘问题(2) 搜索||打表 #include<cstdio> #include<cstring> #include<iostream> #includ ...