sdut2410 Mine Number
来源:互联网 发布:点击访问fc2最新域名 编辑:程序博客网 时间:2024/06/14 04:38
Mine Number
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.
示例输入
27 11100101001012122322122232354532323323555323233123532133321022201333100010001115 6001110013431014541013431001110
示例输出
Case 1:...........*..*.*..*.**.*****.*.**.*****.*.**..***..*.**...*...***...........Case 2:........***...***...***.......
提示
来源
上面的数字3,代表该点八个方向上有三颗雷。
这道题题意也差不多,只是数字所代表的是 上下左右与该点 五个方向的雷数量。
题目会给出数字,让你确定 雷的分布图,每个数据只输出一个解。
DFS,深度优先搜索。
大体的思路方向是:
从0,0开始往后判断,每个点是否放雷,依据就是周围的数字(上下左右)是否有0的情况,有0就不放雷。
放雷后就要将五个方向的数字减1,然后继续往后判断。
这是主要的判断,但是显然需要大的前提来 剪掉大半棵树。
→首先将第一行枚举,然后每一行根据上一行状态来做:
如果上一行同位置数字为0,则该点不放雷。
如果上一行同位置数字为1,则该点必须放雷,此时判断四周是否有0的情况,没有则放雷,有则回溯。
如果上一行同位置数字不为0或者1,则回溯。
判断到最后一行,需要将最后一行数组判断,是否全为0,是则输出结果,不是则回溯。
就是这样!
#include<iostream>#include<string.h>using namespace std;#define MAX 25int n,m,num[MAX][MAX];const int 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) { return (x<0||y<0||x>=n||y>=m); }bool location(int x,int y){ int i,xx,yy; for(int i=0;i<5;i++) { xx=x+dis[i][0]; yy=y+dis[i][1]; if(!isout(xx,yy)&&num[xx][yy]<=0 ) return 0; } return true;}bool judge_final(){ int i; for(i=0;i<m;i++) if(num[n-1][i]!=0) return false; return true;}void 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]; }}void 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]; }}void print(){ int i,j; for(i=0;i<n;i++) { for(j=0;j<m;j++) cout<<Map[i][j]; cout<<endl; }}void dfs(int x,int y){ if( ispos ) return; if( x==n ) { if( judge_final() ) { ispos=1; print(); } return; } if( y==m ) { dfs(x+1,0); return; } if( x==0 ) { if(location(x,y)) { Map[x][y]='*'; change(x,y); dfs(x,y+1); c_back(x,y); ///鸡巴这干什么的 } Map[x][y]='.'; dfs(x,y+1); } else{ if(num[x-1][y]==0) { Map[x][y]='.'; dfs(x,y+1); } else if(num[x-1][y]==1) if(location(x,y)) { Map[x][y]='*'; change(x,y); dfs(x,y+1); c_back(x,y); } }}int main(){ int i,j,test,t_num; char c; cin>>test; for(t_num=1;t_num<=test;t_num++) { cin>>n>>m; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { cin>>c; num[i][j]=c-'0'; } cout<<"Case "<<t_num<<":"<<endl; ispos=0; dfs(0,0); } return 0;}
- sdut2410 Mine Number
- Mine Number
- 山东2012年省赛题之Mine Number
- 山东省第三届省赛(Mine Number)
- SDUT:1143 Mine Number(二进制枚举)
- SDUT 2410 Mine Number DFS+回溯 (扫雷)
- 第三届 山东省ACM省赛 Mine Number
- MINE
- MINE
- mine
- Mine
- 2013山东省第三届ACM省赛 Mine Number
- [2012山东省第三届ACM大学生程序设计竞赛]——Mine Number
- Mine Number(2012年"浪潮杯"山东省第三届ACM大学生程序设计竞赛)
- 2012年"浪潮杯"山东省第三届ACM大学生程序设计竞赛——Mine Number
- SDUT 2410 Mine Number 2012年山东省第三届ACM大学生程序设计竞赛题
- [2012山东省第三届ACM大学生程序设计竞赛]——Mine Number
- Mine Sweeper
- Nginx安装部署
- google gcm推送注意事项
- C/C++段错误问题排查和解决方法
- 平衡二叉树(AVL树)小结
- ADF运行报错:ORA-01005: null password given; logon denied
- sdut2410 Mine Number
- 高效人士睡觉前做的10件事
- Android中内容观察者的使用---- ContentObserver类详解
- 简易Web服务器
- 2015年蓝桥杯省赛B组第10题--生命之树
- Swap Nodes in Pairs--LeetCode
- DataPump使用说明
- ADF中如何将两个独立的LOV实现级联
- Ubuntu 12.04 LTS 中文输入法的安装