DFS--障碍在指定时间会消失
哈利被困在了一个魔法花园里。魔法花园是一个 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--障碍在指定时间会消失的更多相关文章
- 可设置指定时间自己主动消失的 MessageBox实现
本文主要是讲怎样实现可设置指定时间自己主动消失的 MessageBox提示框ShowMessageBoxTimeout实现: 在开发client应用程序的时候.经经常使用得WinForm中Messag ...
- 【转】Expire Google Drive Files 让Google Docs云盘共享连接在指定时间后自动失效
最近在清理Google Docs中之前共享过的文件链接,发现Google Docs多人协作共享过的链接会一直存在,在实际操作中较不灵活.正好订阅的RSS推送了Pseric写的这篇文章 - Expire ...
- 在指定时间干,必须干(kbmmw 中的事件调度)
从去年开始,kbmmw 慢慢增加内涵,除了完善各种服务外,陆续增加和扩展了作为一个中间件必须有的功能, 例如,权限管理.日志系统.调度系统.内存调试等功能. 今天给大家介绍一下kbmmw 的调度事件, ...
- SQL Server 获取最后一天(指定时间的月最后一天日期)
/* author OceanHo @ 2015-10-23 10:14:21 获取指定时间字符串指定日期的月最后一天日期 */ IF OBJECT_ID('get_LastDayDate') IS ...
- C#使用Timer.Interval指定时间间隔与指定时间执行事件
C#中,Timer是一个定时器,它可以按照指定的时间间隔或者指定的时间执行一个事件. 指定时间间隔是指按特定的时间间隔,如每1分钟.每10分钟.每1个小时等执行指定事件: 指定时间是指每小时的第30分 ...
- Android判断当前系统时间是否在指定时间的范围内(免消息打扰)
/** * 判断当前系统时间是否在指定时间的范围内 * * @param beginHour * 开始小时,例如22 * @param beginMin * 开始小时的分钟数,例如30 * @para ...
- sql语句延时执行或者是指定时间执行
--使用waitfor语句延迟或暂停程序的执行 --waitfor{delay'time'|time 'time'} delay是指间隔时间 最长到24小时 time是指定时间执行 waitfor d ...
- java获取系统指定时间年月日
java获取系统指定时间年月日 private String setDateTime(String falg) { Calendar c = Calendar.getInstance(); c.set ...
- s实现指定时间自动跳转到某个页面
--js实现指定时间自动跳转到某个页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...
随机推荐
- JavaSE日常笔记汇总
1. If和switch的比较 2. continue的注意事项 在for循环中,当执行continue语句时,i++还是会执行,continue语句只代表此次循环结束,i还是会累加,并继续执行下次循 ...
- js面向对象案例 贪吃蛇
食物对象 (function () { //map:所在的父盒子,obj自身的一些属都具有默认值 function Food(map, obj) { obj = obj || {}; //没有则使用默 ...
- WPF设置全局字体和字体嵌入
原文:WPF设置全局字体和字体嵌入 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/CLeopard/article/details/40590373 ...
- 2-5 re模块练习题
1 练习: 1.验证手机号是否合法 2.验证邮箱是否合法 3.开发一个简单的python计算器,实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2 ...
- BZOJ4543 Hotel加强版
题面 $\text{BZOJ}$间接权限题 洛谷的弱化版 题解 三点距离两两相等要满足以下条件: 有一个相同的$\text{LCA}$ 所以如果存在一个点,使得另外两个点在它子树中,距离为$d$,且$ ...
- OpenStack入门篇(二十)之实现阿里云ESC多FLAT网络
1.给两台虚拟机增加网卡,使用仅主机模式,网段为:192.168.57.0/24 2.修改两台主机网卡配置 [root@linux-node1 ~]# cp /etc/sysconfig/networ ...
- SpringBoot日记——SpringMvc自动配置与扩展篇
为了让SpringBoot保持对SpringMVC的全面支持和扩展,而且还要维持SpringBoot不写xml配置的优势,我们需要添加一些简单的配置类即可实现: 通常我们使用的最多的注解是: @Bea ...
- Win7搭建FTP服务器
“控制面板” -> “程序和功能” -> “打开或关闭Windows 功能”: 1.展开“Internet 信息服务” 2.勾选“Internet Information Services ...
- python-我的第一门编程语言
一.认识python是一个偶然,由于大学不务正业,混迹于各种电脑维修群(本人专业商务经济专业),了解过C.JAVA.HTML5以及世界上最好的编程语言PHP and so on!了解也仅仅是了解. 二 ...
- Qt-网易云音乐界面实现-8 主导航的实现-QtabWidget
哎呀,堕落了,快有小两周没哟更新了,是在是没有动力了,浏览量连三位数都没有,是在是没有写下去的信心. 还有就是这个网易云音乐的代码量绝对是不可小视的,完全低估了这个软件的能量.昨天仔细想了一下,写不下 ...