zoj 2110 Tempter of the Bone

DFS。

 

之前一直TLE了,死活不会优化 = =。。就搜了下。

 

那个用距离判断的我也加了,还是TLE了 = =。。学到个这个,这一句很神奇。。。

 

 

if( d % 2 != (Time-t) % 2 )

return ;

 

 

刚才自己手动模拟了下,理解了。d是当前点与目标点的坐标差。Time-t即从当前点到达目标点需要走多少步。

 

这两个值的奇偶性是一致的。如果中间没有墙,那么两者应该是d + x == Time - t。d是从当前点到达目标点的最短路,而这个x,设想一下,往外扩展再走,增加的长宽和必定是偶数。而任何数加上偶数奇偶性不变。

 

神奇呀~! = =。。。搜索题还是应该多做啊。。。搜索很神奇。。。就多那么一句话,就让你的代码从TLE到AC。。。呜呜。。

 

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> #include <math.h> #include <queue> using namespace std; char map[10][10]; int n,m,Time,flag,aa,bb; int dir[8] = {0,1,0,-1,1,0,-1,0}; int used[10][10]; int t; void DFS(int a,int b) { int x,y,i,d; if( flag == 1 ) return ; if( t == Time && map[a][b] == 'D' ) { flag = 1; return ; } d = abs(a-aa) + abs(b-bb); if( d + t > Time ) return ; if( d % 2 != (Time-t) % 2 ) return ; for(i=0; i<8 && !flag; i+=2) { x = a + dir[i]; y = b + dir[i+1]; if( x >= 0 && x < n && y >= 0 && y < m && !used[x][y] && map[x][y] != 'X' ) { t++; used[x][y] = 1; DFS(x,y); t--; used[x][y] = 0;; } } } int main() { int len,i,k,a,b; while( scanf("%d%d%d",&n,&m,&Time) && ( n || m || Time ) ) { int wall = 0; for(k=0; k<n; k++) { scanf("%s",map[k]); for(i=0; i<m; i++) { if( map[k][i] == 'S' ) { a = k; b = i; } if( map[k][i] == 'D' ) { aa = k; bb = i; } if( map[k][i] == 'X' ) wall++; } } if( n*m-wall-1 < Time || abs(a-aa) + abs(b-bb) > Time ) { printf("NO/n"); continue; } flag = t = 0; memset(used,0,sizeof(used)); used[a][b] = 1; DFS(a,b); if( flag == 1 ) printf("YES/n"); else printf("NO/n"); } return 0; }  

你可能感兴趣的:(优化,扩展,IM)