博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[2012山东省第三届ACM大学生程序设计竞赛]——Mine Number
阅读量:4977 次
发布时间:2019-06-12

本文共 3296 字,大约阅读时间需要 10 分钟。

Mine Number

题目:

action=showproblem&problemid=2410

Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^

题目描写叙述

Every one once played the game called Mine Sweeping, here I change the rule. You are given an n*m map, every element is a '*' representing a mine, or a '.' representing any other thing. If I ask you what's the total number of mines around (i, j), you should check (i, j)'s up, down, left, right and also itself (if overstep the boundary, ignore it), if that position is a '*', you should add one to the total number of (i, j), and here I call the number Mine Number. For example, if the map is "..**.. ", we can get the Mine Number as "012210" easily, but here is the question, if I give you the Mine Number, can you tell me the original map?
输入
The input consists of multiple test cases.
The first line contains a number T, representing the number of test cases.
Then T lines follow. For each case, the first line contains two numbers n and m (1<=n, m<=20).representing the lines and rows. Then following n lines, each line contain m numbers each number represents the Mine Number.
输出
For each case, please print the case number (beginning with 1) and the original map which you reverted. The data guarantee there is only one result.
演示样例输入
2
7 11
10010100101
21223221222
32354532323
32355532323
31235321333
21022201333
10001000111
5 6
001110
013431
014541
013431

001110

演示样例输出
Case 1:
...........
*..*.*..*.*
*.*****.*.*
*.*****.*.*
*..***..*.*
*...*...***
...........
Case 2:
......
..***.
..***.
..***.

......

来源

2012年"浪潮杯"山东省第三届ACM大学生程序设计竞赛

一道搜索题,比赛时就是研究这道题,和一起。话说当时方向对了,解题思路非常正确。可是编程时候出了点问题。尤其是最后的代码输出,输出一个字符和一个空格。。

。事实上应该没有空格的。。

。o(╯□╰)o啊。。。

言归正传:

这道题题意非常easy,扫雷玩过吧?

         

上面的数字3,代表该点八个方向上有三颗雷。

这道题题意也差点儿相同,仅仅是数字所代表的是 上下左右与该点   五个方向的雷数量。

题目会给出数字,让你确定 雷的分布图。每一个数据仅仅输出一个解。

DFS,深度优先搜索。

大体的思路方向是:

从0,0開始往后推断。每一个点是否放雷。根据就是周围的数字(上下左右)是否有0的情况。有0就不放雷。

放雷后就要将五个方向的数字减1,然后继续往后推断。

这是基本的推断,可是显然须要大的前提来 剪掉大半棵树。

→首先将第一行枚举,然后每一行依据上一行状态来做:

假设上一行同位置数字为0,则该点不放雷。

假设上一行同位置数字为1。则该点必须放雷,此时推断四周是否有0的情况,没有则放雷,有则回溯。

假设上一行同位置数字不为0或者1。则回溯。

推断到最后一行,须要将最后一行数组推断,是否全为0,是则输出结果。不是则回溯。

就是这样。

#include 
#include
using namespace std;#define MAX 25int n,m,num[MAX][MAX],dis[5][2]={0,0,1,0,-1,0,0,1,0,-1};char Map[MAX][MAX];bool ispos;// 推断出界bool isout(int x,int y){ if( x<0 || y<0 || x>=n || y>=m ) return 1; return 0;}// 推断五个点是否有小于等于0的位置bool location(int x,int y){ int i,xx,yy; for(i=0;i<5;++i) { xx=x+dis[i][0]; yy=y+dis[i][1]; if( !isout(xx,yy) && num[xx][yy]<=0 ) return false; } return true;}// 假设放雷,五个点数字减1void change(int x,int y){ int i,xx,yy; for(i=0;i<5;++i) { xx=x+dis[i][0]; yy=y+dis[i][1]; if( isout(xx,yy) ) continue; --num[xx][yy]; }}// 假设该地原来放雷,可是应该不放。回溯,五个点数字加1void c_back(int x,int y){ int i,xx,yy; for(i=0;i<5;++i) { xx=x+dis[i][0]; yy=y+dis[i][1]; if( isout(xx,yy) ) continue; ++num[xx][yy]; }}// 推断最后一行是否符合条件bool judge_final(void){ int i; for(i=0;i
>test; for(t_num=1;t_num<=test;++t_num) { cin>>n>>m; for(i=0;i
>c; num[i][j]=c-'0'; } cout<<"Case "<
<<":"<

转载于:https://www.cnblogs.com/jhcelue/p/7043891.html

你可能感兴趣的文章
LLBL Gen 3.x 源代码追踪与解析 查询命令的追踪
查看>>
.NET 部署-03Web Deployment项目-02属性页
查看>>
如何禁止IE缓存,采用Ajax技术数据更新不及时
查看>>
[六省联考2017]分手是祝愿
查看>>
Power Crisis
查看>>
Linux下入侵命令有哪些
查看>>
VS2013常用快捷键
查看>>
ural1297
查看>>
MATLAB 制作GIF图像
查看>>
FloatingWindow : 如何访问Host对象
查看>>
spark.streaming.kafka.maxRatePerPartition的理解
查看>>
函数习题2
查看>>
支付宝支付流程
查看>>
TensorFlow 官方文档 Programmer's Guide 中文翻译 —— 引言
查看>>
11 二叉搜索树的后序遍历序列
查看>>
Android------视频播放器(包含全屏播放,快退,快进,腾讯新闻的列表播放等)...
查看>>
javascript设计模式--状态模式(State)
查看>>
NO3系统升级-资产棚卸
查看>>
《BI项目笔记》创建计算成员
查看>>
两个链表的第一个公共节点
查看>>