差距啊,知道整体思路,知道如何剪枝了,结果效率还是比别人慢那么多,唉……
奇偶性剪枝还有路径剪枝,具体看下大牛的结题报告吧
http://acm.hdu.edu.cn/forum/read.php?tid=6158
写得好详细,学习了
#include <stdio.h> #include <iostream> #include <string.h> #include <stdlib.h> using namespace std; char map[9][9]; int n,m,t,di,dj; //(di,dj):门的位置 bool escape; int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}}; //分别表示下、上、左、右四个方向 void dfs(int si,int sj,int cnt) //表示起始位置为(si,sj),要求在第cnt秒达到门的位置 { int i,temp; if( si>n || sj>m || si<=0 || sj<=0 ) return; if( si==di && sj==dj && cnt==t ) { escape = 1; return; } temp = (t-cnt) - abs(si-di) - abs(sj-dj); if( temp<0 || temp&1 ) return; for( i=0; i<4; i++ ) { if( map[ si+dir[i][0] ][ sj+dir[i][1] ] != 'X') { map[ si+dir[i][0] ][ sj+dir[i][1] ] = 'X'; dfs(si+dir[i][0], sj+dir[i][1], cnt+1); if(escape) return; map[ si+dir[i][0] ][ sj+dir[i][1] ] = '.'; } } return; } int main() { int i,j,si,sj; while( cin >> n >> m >> t) { if( n==0 && m==0 && t==0 ) break; int wall = 0; for( i=1; i<=n; i++ ) for( j=1; j<=m; j++ ) { cin >> map[i][j]; if(map[i][j]=='S') { si=i; sj=j; } else if( map[i][j]=='D' ) { di=i; dj=j; } else if( map[i][j]=='X' ) wall++; } if( n*m-wall <= t ) { cout << "NO" << endl; continue; } escape = 0; map[si][sj] = 'X'; dfs( si, sj, 0 ); if( escape ) cout << "YES" << endl; else cout << "NO" << endl; } return 0; }