一道很陈的搜索题了,深搜实现的,但我还是发现了一些之前没有注意的地方……
第一,全局变量的赋值应该注意……………………。
第二,就是搜索的优化剪枝问题,这种题很容易超时。
下面是代码:
#include<stdio.h> #include<string.h> #include<math.h> int dir[4][2]={-1,0,1,0,0,1,0,-1}; int n,m,t,si,sj,di,dj,wall=0,flag=0; char map[9][9]; void getmap() { int i,j; wall=0; for(i=0;i<n;i++) for(j=0;j<m;j++) { scanf("%1s",&map[i][j]); if(map[i][j]=='S'){ si=i; sj=j; } if(map[i][j]=='D'){ di=i; dj=j; } if(map[i][j]=='X')wall++; } } void dfs(int a,int b,int cnt) { int i,temp; if(a<0||b<0||a>n-1||b>m-1)return; if(a==di&&b==dj&&cnt==t) flag=1; if(flag) return; temp=t-cnt-abs(a-di)-abs(b-dj); //剪枝 if(temp<0||temp&1)return; //temp为负数或奇数时,无法到达 for(i=0;i<4;i++) { if(map[ a+dir[i][0] ][ b+dir[i][1] ]!='X') { map[ a+dir[i][0] ][ b+dir[i][1] ]='X'; dfs(a+dir[i][0],b+dir[i][1],cnt+1); map[ a+dir[i][0] ][ b+dir[i][1] ]='.'; } } return; } int main() { while(scanf("%d%d%d",&n,&m,&t),n) { wall=0; getmap(); if(n*m-wall-1<t) //剪枝 { printf("NO/n");continue; } flag=0; map[si][sj]='X'; dfs(si,sj,0); if(flag==1) printf("YES/n"); else printf("NO/n"); } return 0; }