杭电1010-搜索&&迷宫问题

来源:互联网 发布:c语言入门教程pdf 编辑:程序博客网 时间:2024/06/05 12:49

迷宫问题,注意剪枝!!!

AC代码:

#include<stdio.h>#include<math.h>int n,m,t,flag;int startx,starty,endx,endy,starttime,wallnum;int movex[]={0,-1,0,1},movey[]={-1,0,1,0};//char maze[10][10];int abs(int a,int b){int c;c=a-b;if(c>0)   return c;else   return b-a;}int dfs(int sx,int sy,int st){int i,time;if(sx==endx&&sy==endy&&st==t){//到达终点 flag=1;return 1;}time=t-st-abs(sx,endx)-abs(sy,endy);if(time<0||time%2!=0)//剪枝   return 0;for(i=0;i<4;i++){if(sx+movex[i]<0||sx+movex[i]>m-1||sy+movey[i]<0||sy+movey[i]>n-1)  continue;  if(maze[sx+movex[i]][sy+movey[i]]!='X')  {  maze[sx+movex[i]][sy+movey[i]]='X';  dfs(sx+movex[i],sy+movey[i],st+1);  maze[sx+movex[i]][sy+movey[i]]='.';  }  if(flag) break;} }int main(){while(scanf("%d%d%d",&m,&n,&t)!=EOF&&!(m==0&&n==0&&t==0)){int i,j;getchar();//flag=0;//标志量 ,为1时说明找到出口 wallnum=0;//墙的数量起始为0 for(i=0;i<m;i++) {  for(j=0;j<n;j++)  {  scanf("%c",&maze[i][j]);  if(maze[i][j]=='S')  {  startx=i;  starty=j;  maze[startx][starty]='X';//标记起始位置,走过的不能再走了   }  else if(maze[i][j]=='D')  {  endx=i;endy=j;  }  else if(maze[i][j]=='X')  wallnum++;   }  getchar();//接受换行符      }    if(n*m-wallnum>=t){dfs(startx,starty,0);} if(flag)     printf("YES\n");else   printf("NO\n");}return 0;}


原创粉丝点击