Mine Number

题目:http://acm.sdut.edu.cn/sdutoj/problem.php?

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 <iostream>
#include <string.h>
using namespace std;
#define MAX 25
int 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;
}
// 假设放雷,五个点数字减1
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];
}
}
// 假设该地原来放雷,可是应该不放。回溯,五个点数字加1
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];
}
}
// 推断最后一行是否符合条件
bool judge_final(void)
{
int i;
for(i=0;i<m;++i)
if( num[n-1][i]!=0 ) return false;
return true;
}
// 输出结果
void print(void)
{
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 ) // 上一行为0,此行不能放雷
{
Map[x][y]='.';
dfs(x,y+1);
}
else if( num[x-1][y]==1 ) // 上一行为1,此行必须放雷,推断四周是否有0情况
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(i=0;i<n;++i)
for(j=0;j<m;++j)
{
cin>>c;
num[i][j]=c-'0';
}
cout<<"Case "<<t_num<<":"<<endl;
ispos=0;
dfs(0,0);
}
return 0;
}

[2012山东省第三届ACM大学生程序设计竞赛]——Mine Number的更多相关文章

  1. [2012山东省第三届ACM大学生程序设计竞赛]——n a^o7 !

    n a^o7 ! 题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2413 Time Lim ...

  2. 2012年"浪潮杯"山东省第三届ACM大学生程序设计竞赛--n a^o7 ! 分类: 比赛 2015-06-09 17:16 14人阅读 评论(0) 收藏

    n a^o7 ! Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 All brave and intelligent fighte ...

  3. Alice and Bob(2013年山东省第四届ACM大学生程序设计竞赛)

    Alice and Bob Time Limit: 1000ms   Memory limit: 65536K 题目描述 Alice and Bob like playing games very m ...

  4. sdut Mountain Subsequences 2013年山东省第四届ACM大学生程序设计竞赛

    Mountain Subsequences 题目描述 Coco is a beautiful ACMer girl living in a very beautiful mountain. There ...

  5. 2013年山东省第四届ACM大学生程序设计竞赛-最后一道大水题:Contest Print Server

    点击打开链接 2226: Contest Print Server Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 53  Solved: 18 [Su ...

  6. 山东省第四届ACM大学生程序设计竞赛解题报告(部分)

    2013年"浪潮杯"山东省第四届ACM大学生程序设计竞赛排名:http://acm.upc.edu.cn/ranklist/ 一.第J题坑爹大水题,模拟一下就行了 J:Contes ...

  7. angry_birds_again_and_again(2014年山东省第五届ACM大学生程序设计竞赛A题)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2877 题目描述 The problems ca ...

  8. 2013年山东省第四届ACM大学生程序设计竞赛 Alice and Bob

      Alice and Bob Time Limit: 1000ms   Memory limit: 65536K 题目描述 Alice and Bob like playing games very ...

  9. 2013年山东省第四届ACM大学生程序设计竞赛J题:Contest Print Server

    题目描述     In ACM/ICPC on-site contests ,3 students share 1 computer,so you can print your source code ...

随机推荐

  1. NOIp模拟赛三十四(yxq供题)

    毒瘤yxq! 毒瘤yxq! 毒瘤yxq! 据yxq自己说,林导让他出题的时候要求是“代码量少”,“思维难度高”,“不涉及太复杂的算法”,而且“最好要让myh有一题做不出来”(狙击myh).于是今天的题 ...

  2. [zjoi2016]小星星 (容斥+DP)

    我们先用树形DP,求出选取集合S中的点,满足连通性的但是标号可重的方案数,贡献给F(i)(1\(\leq\)i\(\leq\)\(\mid S\mid\)),也就是我们要处理出F(i)代表取至多i个点 ...

  3. 【Henu ACM Round#24 E】Connected Components

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 要求把连续的一段li..ri的边全都删掉. 然后求剩下的图的联通数 如果暴力的话 复杂度显然是O(k*m)级别的. 考虑我们把li. ...

  4. Obfuscating computer code to prevent an attack

    A method and system for obfuscating computer code of a program to protect it from the adverse effect ...

  5. Android里使用正則表達式

    在Android里怎样使用正則表達式: 以验证username为例.username一般字母开头,同意字母数字下划线.5-16个字节: String regEx = "^[a-zA-Z][a ...

  6. swift学习笔记(五)构造过程

    构造过程是为了使用某个类.结构体或枚举类型的实例而进行的准备过程.在构造过程中,对每一个属性进行了初始值预设和其它必要的准备和初始化工作. 与OC相比,swift的构造函数.不须要返回值.同一时候,在 ...

  7. IOS开发的哪些异常之异常断点

    从Android开发的异常报错到IOS的异常闪退,经历了不一样的处理过程.对于IOS的异常报错刚開始总是非常茫然,永远仅仅告诉你有异常.然后就跳到main.m文件,却不曾我告诉她在那出现.真是吊人胃口 ...

  8. poj_2828线段树,逆序插入

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #d ...

  9. 33.AngularJS 应用 angular.module定义应用 angular.controller控制应用

    转自:https://www.cnblogs.com/best/tag/Angular/ AngularJS 模块(Module) 定义了 AngularJS 应用. AngularJS 控制器(Co ...

  10. CSS中关于vertical-align垂直对齐

    一向以来,我对vertical-align的属性都搞的不是太清楚,今天刚好碰到有朋友问我相关的问题,于是自己潜心研究了一番,发现这玩意还真不是个简单的东西,在此我分享的东西都是抛弃脑残的IE的,如果你 ...