迷宫中回溯法的剪枝——奇偶剪枝(hdu 1010 Tempter of the Bone)

来源:互联网 发布:算法研发工程师面试题 编辑:程序博客网 时间:2024/05/03 02:09

转自:http://blog.csdn.net/code_pang/article/details/8839432

问题描述

在一个n行m列的迷宫中,每一步只能向上、下、左、右中任意方向走一格,迷宫中有围墙的地方是无法到达的。从起点s开始,能否刚好走t步,到达e。

例如在下面5行5列的迷宫中,能否恰好经过9步,从s走到e。初始位置在s上,#是围墙。



奇偶剪枝

设起点s的坐标为(sx,sy),终点e的坐标为(ex,ey);

对s的一次操作为对sx或sy进行+1或-1;

若经过t次操作后,s的坐标刚好等于e,则说从s经过t步可以到达e。

在理想情况下,s到e需要的最小步数为m

m=|ex-sx|+|ey-sy|

若t<m,肯定是无法到达的。

当t>=m时,从s到e的行走路径由两部分组成,

一部分为需要走的最少步数m;

另一部分是为了使得刚好行走t步到达e,所需要走的附加步数a,a=t-m;

这a步即为:从需要走m步的最短路径上走出去,再回到最短路径上所走的步数。

假设走出去这段路径长度为b,那回来时的路径长度一定也是b,因此,附加步数的路径长度a等于2b步。

因为走出去时,对坐标进行了b次+1或-1的操作,为使坐标再恢复到最短路径上,就需要进行b次-1或+1的操作,并且与走出去时是相反的。注意:走出去和拐回来的过程中可能参杂着最短路径上的操作,所以b是除去这些参杂操作后的步数。

如下图所示:


从s到e的黑色路径为一条最短路径,红色和蓝色路线组成的路径,为走出最短路径的路径。其中蓝色箭头是参杂着的最短路径中的操作,只有红色箭头才是走出去和拐回来的路径,如果将红色路径去掉,从s向右走,经过绿色箭头到达e,这也是一条最短路径。

因为a=2b,是个偶数,又因为a=t-m,所以当t和m的奇偶性相同时,a才能是偶数。也就是说,当t和m的奇偶性相同时,才有可能从s经过t步,到达e。

所以,当最小步数m与t同为奇数,或同为偶数时,才有可能从s经过t步,到达e

 #include<iostream>#include<math.h>#include<string.h>#include<queue>#include<memory.h>using namespace std;int n,m,t;char a[100][100];int visited[100][100];int dir[4][2]={0,1,0,-1,1,0,-1,0};int flag;int sx,sy,ex,ey;void dfs(int x,int y,int sum){     int i,mx,my,d;     if(flag==1)//找到了    return;     if(x==ex&&y==ey&&sum==t) //找到了     {  flag=1;  return;}     d=abs(x-ex)+abs(y-ey);//当前点到终点的最短距离       剪枝  if(d>t-sum||(t-sum-d)%2!=0) return;//最短距离大于剩下的时间或者剩余的时间减去最短路径为奇数 for(i=0;i<4;i++) { mx=x+dir[i][0]; my=y+dir[i][1]; if(mx>=0&&mx<n&&my>=0&&my<m&&visited[mx][my]==0&&a[mx][my]!='X') { visited[mx][my]=1; dfs(mx,my,sum+1); visited[mx][my]=0; } } } int main(){    while(cin>>n>>m>>t)    {    if(n==0&&m==0&&t==0)    break;     int temp=0;        for(int i=0;i<n;i++)          for(int j=0;j<m;j++)          {              cin>>a[i][j];              if(a[i][j]=='S')   { sx=i; sy=j; }              if(a[i][j]=='D')   { ex=i; ey=j;}         }         flag=0; memset(visited,0,sizeof(visited)); visited[sx][sy]=1;         dfs(sx,sy,0);         if(flag==0)  cout<<"NO"<<endl;         else         cout<<"YES"<<endl;    }       return 0;}


1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 后滚翻翻不过去怎么办 走太多路小腿疼怎么办 踢毽子以后期盖右腿内彻疼怎么办 大学体育选修课挂了怎么办 当天贴的砖踩了怎么办 刚贴的瓷砖踩了怎么办 长胶底板太轻怎么办 乒乓球拍胶皮不粘了怎么办 乒乓球拍子胶片太滑怎么办 新买的包黏黏的怎么办 卫星锅收不到台怎么办 养殖厂被卫星拍住怎么办 中六卫星无信号怎么办 晒出成片的斑怎么办 太阳晒出胳膊上长斑怎么办 宇航员在太空死后怎么办 太阳暴晒起的斑怎么办 太阳晒出来的斑怎么办 被认定D级危房怎么办 突然发现两个关系遥远怎么办 如果没有地球人类会怎么办 小锅盖被屏蔽了怎么办 美的冰箱故障通讯不合格怎么办 美的冰箱通讯不合格怎么办 文明6金币降到0怎么办 紫癜肾炎长期尿潜血怎么办 肾移植后血压高怎么办 尿道长了个肿瘤怎么办 吃了有病的鹅怎么办 狗狗得了乳腺瘤怎么办 孕28周还是臀位怎么办 怀孕五个月胎位不正怎么办 33周了胎位不正怎么办 足月胎儿不足5斤怎么办 绒癌观察期怀孕怎么办 宝宝囱门闭合晚怎么办 慢性硬脑膜下血肿复发怎么办 佝偻病导致囟门晚闭怎么办 儿童液体补多了怎么办 脑脊液鼻漏3年了怎么办 结石掉到膀胱里怎么办