标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 87199 Accepted Submission(s): 23744
#include<iostream> #include<cmath> #include<cstring> using namespace std; #define N 15 char maps[N][N]; int n, m, t, flag, dx, dy, vis[N][N]; int dir[4][2] = { {0,1}, {0, -1}, {1, 0}, {-1, 0}}; void dfs(int x, int y, int k) { if(flag) return ; if(x == dx && y == dy && k == 0) flag = 1; // 如果正好到达,flag = 1; int tmp = abs(x - dx) + abs(y-dy); if(k < tmp) return ; // 如果所剩步数比所需步数 tmp小,return for(int i = 0; i < 4; i++) { int nx, ny; nx = x + dir[i][0]; ny = y + dir[i][1]; if(nx >= 0 && nx < n && ny >= 0 && ny < m && maps[nx][ny] != ‘X‘ && !vis[nx][ny]) { vis[nx][ny] = 1; dfs(nx, ny, k-1); vis[nx][ny] = 0; } } } int main() { int sx, sy; while(cin >> n >> m >> t, n+m+t) { flag = 0; memset(vis, 0, sizeof(vis)); // 每次都要清0; for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) { cin >> maps[i][j]; if(maps[i][j] == ‘S‘) sx = i, sy = j; else if(maps[i][j] == ‘D‘) dx = i, dy = j; } int q = (sx+sy)%2, w = (dx+dy)%2; vis[sx][sy] = 1; if((q+w)%2 == t%2) // 剪枝,如果到达所需步数和所给 t 奇偶性不一样的话,就不执行dfs了,no dfs(sx, sy, t); if(flag) cout << "YES" << endl; else cout << "NO" << endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/Tinamei/p/4661445.html