其实就是一般的搜索题,问题是剪枝,迷之无限TLE,然后按照别人的写法,发现自己案例都过不去了。按照别人AC的代码一点点改自己可是一直不对。。。最后改了输入输出那边就AC了。可我还是不知道为什么要这样输入数组来找X2。。。
#include <iostream> #include <algorithm> using namespace std; int n,m,ex,ey,sx,sy,flag; char map[15][15]; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; void dfs(int x,int y,int t); int judge(int x,int y); int main(int argc, char const *argv[]) { int t; while(cin >> n >> m >> t, n|m|t) { for(int i = 0; i < n; i++) { cin >> map[i]; for(int j = 0; j < m; j++) { if(map[i][j] == 'S') { sx = i;sy = j; map[i][j] = 'X'; } else if(map[i][j] == 'D') { ex = i; ey = j; } } } flag=0; dfs(sx,sy,t); flag?printf("YES\n"):printf("NO\n"); } return 0; } void dfs(int r, int c, int time) { if(flag) return ; if((time<abs(r-ex)+abs(c-ey)) || (r+c+ex+ey+time)%2)//减枝 return ; if(time == 0) { if(r == ex && c == ey) { flag = 1; return; } else return; } for(int i = 0; i < 4; i++) { int nr = r + dir[i][0]; int nc = c + dir[i][1]; if(nr>=0 && nr<n && nc>=0 && nc<m && map[nr][nc]!='X') { map[nr][nc] = 'X'; dfs(nr, nc, time-1); map[nr][nc] = '.'; } } } int judge(int x,int y) { if(x>0 && y>0 && x<=n && y<=m) return 1; else return 0; }