{{{ #!cplusplus /* hdu 1010 DFS+剪枝 ymc 2008/09/16 题目大意: 在n×m的地图上,一直从位置S出发,是否能恰好在t时刻到D。 X代表墙,.代表空地。所有空地只能走一次。 分析与解题思路: 从S出发,DFS搜索D。但是容易TLE 剪枝条件: 1.奇偶性:给地图上黑白色,相邻的上不同颜色。没走一步颜色变化一次。 所以S与D的坐标距离(x之差+y之差)与t的奇偶性不一致是,必定无解。 2.所有能走的格子个数如果小于t,必定无解。 3.DFS(x,y,k),为当前位置为(x,y),时间为k时的状态。 则(x,y)与D的坐标距离大于t-k或者奇偶性步一致时,剪枝。 */ #include #include #include using namespace std; const int N=10; char map[N][N]; int n,m,t; int step[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int sx,sy,ex,ey; bool ans; int num; int dist[N][N]; void Init() { num=0; for(int i=0;it) return; if(k==t&&x==ex&&y==ey) { ans=true; return; } if(ans==true) return; int tmp=t-k-abs(ex-x)-abs(ey-y); if(tmp<0||tmp%2==1) //剪枝,关键,距离与奇偶性 return; int x1,y1; for(int i=0;i<4;i++) { x1=x+step[i][0]; y1=y+step[i][1]; if(x1<0||x1>=n||y1<0||y1>=m||map[x1][y1]=='X') continue; map[x][y]='X'; DFS(x1,y1,k+1); map[x][y]='.'; } } void Solve() { int dx,dy; dx=abs(sx-ex); dy=abs(sy-ey); if((dx+dy-t)%2==1) return; if(num