Tempter of the Bone
版权声明:本文为博主原创文章,未经允许不得转载
第一次写dfs的题目,看了很多题解,深搜+剪枝
奇偶剪枝:
从起始点到终点无论怎么走,总可以分为最短路以及多走的路,而多走的路又可以分成靠近最短路径以及远离最短路径两部分,且二者必是对称的,所以多走的路长度必是偶数

#include<stdio.h> #include<string.h> #include<math.h> int sx,sy,ex,ey; int m,n,t; int flag; int vis[10][10]; char map[10][10]; int dx[]={0,0,-1,1}; int dy[]={-1,1,0,0}; void dfs(int x,int y,int sum) { int xx,yy; if(flag==1) return; if(x==ex&&y==ey&&sum==t) { flag=1; return; } int middis=abs(ex-x)+abs(ey-y); if(middis>t-sum||(t-sum-middis)%2!=0)//奇偶剪枝 return; for(int i=0;i<4;i++) { xx=x+dx[i]; yy=y+dy[i]; if(xx>=0&&xx<n&&yy>=0&&yy<m&&!vis[xx][yy]&&map[xx][yy]!='X') { vis[xx][yy]=1; dfs(xx,yy,sum+1); vis[xx][yy]=0; } } } int main() { while(scanf("%d%d%d",&n,&m,&t)==3) { int num=0; if(n==0) break; for(int i=0;i<n;i++) { scanf("%s",&map[i]); for(int j=0;j<m;j++) { if(map[i][j]=='S') { sx=i; sy=j; } else if(map[i][j]=='D') { ex=i; ey=j; } else if(map[i][j]=='X') num++; } } if(n*m-num-1<t) { printf("NO\n"); continue; } flag=0; memset(vis,0,sizeof(vis)); vis[sx][sy]=1; dfs(sx,sy,0); if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }

浙公网安备 33010602011771号