哈利被困在了一个魔法花园里。魔法花园是一个 N*M 的矩形,在其中有着许多植物,

这些植物会在时刻 K 的倍数消失。 哈利每单位时间都会选择上、下、左、右四

个方向的其中一个进行移动。

#include<iostream>
using namespace std;
int n,m,k;
#define max 100
char mmap[max][max];
int mmin;
#define MIN(a,b) ((a)<(b)?(a):(b));
int x1,x2,y1,y2;
int mmde[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int visited[max][max];
int step;
int sum;
void dfs(int x,int y){ int i;
int mx,my;
if(mmap[x][y]=='3'){
mmin=MIN(step,mmin); }
else
// if(mmap[x][y]!='1'||(step%k==0&&mmap[x][y]=='1'))
{
int no=0;
for(i=0;i<4;i++){
mx=x+mmde[i][0];
my=y+mmde[i][1];
// cout<<"pre:"<<endl<<" x: "<<mx<<" y: "<<my<<" step: "<<step<<endl;
if(
(
(mmap[mx][my]!='1'&&!visited[mx][my]&&mx>=1&&mx<=n&&my>=1&&my<=m)
||
(
(step+1)%k==0&&mmap[mx][my]=='1'
)
)
&&
(
abs(mx-x2)+abs(my-y2)+step<mmin
)
){
step++;
sum++;
visited[mx][my]=1;
dfs(mx,my);
visited[mx][my]=0;
step--; }
else no++;
/*
else if(abs(mx-x2)+abs(my-y2)+sum>mmin){
cout<<"too long"<<endl; }
else
{
cout<<"weizhishoxian"<<endl; } */
}
//重复走 样例3
if(no==4){
for(i=0;i<4;i++){
mx=x+mmde[i][0];
my=y+mmde[i][1];
if(mmap[mx][my]=='0'||mmap[mx][my]=='2'){
// cout<<"visited---mmap["<<mx<<"]["<<my<<"] to 0"<<endl;
visited[mx][my]=0;} }
for(i=0;i<4;i++){
mx=x+mmde[i][0];
my=y+mmde[i][1];
if(
(
(mmap[mx][my]!='1'&&!visited[mx][my]&&mx>=1&&mx<=n&&my>=1&&my<=m)
||
(
(step+1)%k==0&&mmap[mx][my]=='1'
)
)
&&
(
abs(mx-x2)+abs(my-y2)+step<mmin
)
){
step++;
sum++;
visited[mx][my]=1;
dfs(mx,my);
visited[mx][my]=0;
step--; }
}
} }
}
int main(){
//scanf("%d%d%d",&n,&m,&k);
int icase;
cin>>icase;
while(icase--){
cin>>n>>m>>k;
int i,j;
memset(visited,0,sizeof(visited));
mmin=1000000;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
cin>>mmap[i][j];
if(mmap[i][j]=='2')
{x1=i;y1=j;}
else if(mmap[i][j]=='3')
{x2=i;y2=j;}
}
}
visited[x1][y1]=1;
// cout<<"now:x1:"<<x1<<" y1:"<<y1<<endl;
step=0;
sum=0;
dfs(x1,y1);
if(mmin==1000000)cout<<"Mobiliarbus"<<endl;
else cout<<mmin<<endl;
// cout<<"sum:"<<sum<<endl;
}
}
/*
100
6 6 2
000200
000100
010000
000100
000100
001310
7
6 6 2
000300
000100
010000
000100
000100
001210
Mobiliarbus
3 5 3
00102
00011
00300
6
3 5 3
00002
00111
00300
4
&&(abs(mx-x2)+abs(my-y2)+step<=mmin))剪枝
*/

版权声明:本文为博主原创文章,未经博主允许不得转载。

DFS--障碍在指定时间会消失的更多相关文章

  1. 可设置指定时间自己主动消失的 MessageBox实现

    本文主要是讲怎样实现可设置指定时间自己主动消失的 MessageBox提示框ShowMessageBoxTimeout实现: 在开发client应用程序的时候.经经常使用得WinForm中Messag ...

  2. 【转】Expire Google Drive Files 让Google Docs云盘共享连接在指定时间后自动失效

    最近在清理Google Docs中之前共享过的文件链接,发现Google Docs多人协作共享过的链接会一直存在,在实际操作中较不灵活.正好订阅的RSS推送了Pseric写的这篇文章 - Expire ...

  3. 在指定时间干,必须干(kbmmw 中的事件调度)

    从去年开始,kbmmw 慢慢增加内涵,除了完善各种服务外,陆续增加和扩展了作为一个中间件必须有的功能, 例如,权限管理.日志系统.调度系统.内存调试等功能. 今天给大家介绍一下kbmmw 的调度事件, ...

  4. SQL Server 获取最后一天(指定时间的月最后一天日期)

    /* author OceanHo @ 2015-10-23 10:14:21 获取指定时间字符串指定日期的月最后一天日期 */ IF OBJECT_ID('get_LastDayDate') IS ...

  5. C#使用Timer.Interval指定时间间隔与指定时间执行事件

    C#中,Timer是一个定时器,它可以按照指定的时间间隔或者指定的时间执行一个事件. 指定时间间隔是指按特定的时间间隔,如每1分钟.每10分钟.每1个小时等执行指定事件: 指定时间是指每小时的第30分 ...

  6. Android判断当前系统时间是否在指定时间的范围内(免消息打扰)

    /** * 判断当前系统时间是否在指定时间的范围内 * * @param beginHour * 开始小时,例如22 * @param beginMin * 开始小时的分钟数,例如30 * @para ...

  7. sql语句延时执行或者是指定时间执行

    --使用waitfor语句延迟或暂停程序的执行 --waitfor{delay'time'|time 'time'} delay是指间隔时间 最长到24小时 time是指定时间执行 waitfor d ...

  8. java获取系统指定时间年月日

    java获取系统指定时间年月日 private String setDateTime(String falg) { Calendar c = Calendar.getInstance(); c.set ...

  9. s实现指定时间自动跳转到某个页面

    --js实现指定时间自动跳转到某个页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...

随机推荐

  1. 内存管理与正则(re)模块

    内存管理 垃圾回收机制 不能被程序访问到的数据,就称之为垃圾 也就是失去了一个能够访问到值数据的名称空间,导致在内存中无作为 引用计数:是内存管理的原理 引用计数是用来记录值的内存地址被记录的次数 每 ...

  2. 【安装Ecshop2.7.2网站(LAMP环境)】--实践

    LAMP : Linux + Apache + Mysql + PHPEcshop2.7.2 注意:在输入命令过程中,学会用tab键补全命令,不要对着照抄,很容易出错. 前置:A:先设置虚拟机中的CD ...

  3. 经典算法--冒泡排序(Java)

    原理:将相邻元素的较大值赋给右边 思路:① 1.将集合或数组内的第一个元素与第二个元素进行比较,较大值赋给右边: 2.将第二个元素与第三个元素进行比较,较大值赋给右边: ....... (N-1).将 ...

  4. JavaWeb基础—JSP

    一.什么是JSP JSP 全称是 Java Server Pages,是一种开发动态web资源的技术 在原HTML上添加JAVA脚本(灵魂工程师,为页面添加灵魂),可以说 jsp = html + j ...

  5. WPF 自定义ComboBox样式,自定义多选控件

    原文:WPF 自定义ComboBox样式,自定义多选控件 一.ComboBox基本样式 ComboBox有两种状态,可编辑和不可编辑状态.通过设置IsEditable属性可以切换控件状态. 先看基本样 ...

  6. 【python3】文件格式转换windows转为unix

    一.场景 工作需要,有时要将文件上传到 unix 的服务器,希望将文件的格式改为 Unix(LF), 可以通过py脚本来批量处理. 二.代码 import os # 转换文件格式和编码方式 def t ...

  7. MySQL中类型后面的数字含义

    形式:类型(m) 1.整数型的数值类型已经限制了取值范围,有符号整型和无符号整型都有,而M值并不代表可以存储的数值字符长度,它代表的是数据在显示时显示的最小长度,当存储的字符长度超过M值时,没有任何的 ...

  8. jmeter no-gui模式动态传递场景参数

    jmeter进行性能压测时,有时候需要在linux上no-gui模式下运行,为了在no-gui模式下更方便的设置脚本的运行的场景, 将脚本的线程数,运行时间设置为动态参数,可以在脚本运行时动态设置“线 ...

  9. C#,清晨随手写

    关于昨晚“猜拳”的博客   大家一定要记得,C#的书写规范是很严格的   很严格很严格很严格  简单的说  下面这样就没办法取值 但是这样就可以取值 插眼,开撸

  10. STM8S——Universal asynchronous receiver transmitter (UART)

    UART基本介绍: 通用异步收发器UART他的功能非常强大 我们只使用UART的全双工异步通信功能,使用中断接收数据. UART_RX:串行数据输入. UART_TX:串行数据输出. 硬件支持: 连接 ...