DFS--障碍在指定时间会消失
2014-12-11 14:39
148 查看
哈利被困在了一个魔法花园里。魔法花园是一个 N*M 的矩形,在其中有着许多植物,
这些植物会在时刻 K 的倍数消失。 哈利每单位时间都会选择上、下、左、右四
个方向的其中一个进行移动。
这些植物会在时刻 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--障碍在指定时间会消失
- JS控制一个DIV层在指定时间内消失的方法
- 可设置指定时间自己主动消失的 MessageBox实现
- div 指定时间消失
- hdu--1010(走迷宫,指定时间内到达目的)(DFS+剪枝)
- JS控制一个DIV层在指定时间内消失
- JS控制一个DIV层在指定时间内消失
- 可设置指定时间自动消失的 MessageBox实现
- 能否在指定时间恰好到达一点-dfs
- div代替window.alert,让这个div显示信息后,在指定之间时间内消失
- JS控制一个DIV层在指定时间内消失的方法
- php获取指定日期之间的各个周和月的起止时间
- DFS-BFS搜索专题【经典训练题】【有时间一个个做下来】
- 获取到指定时间区间的月份集合,以及月份集合的月份第一天和最后一天
- Rehl7 设置ntp服务,同步指定服务器时间。Ntp改为chrony
- C# NTP 时钟同步,获取指定IP地址的系统时间及错误问题解决。
- 列出指定目录下所有文件的最后被修改时间
- 查找指定时间的文件并删除
- poj 3321 Apple Tree DFS时间戳预处理+树状数组
- php日期转时间戳,指定日期转换成时间戳