标签:des style blog java color strong
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 68206 Accepted Submission(s): 18719
题意:就是狗要找到一条路在规定的步数正好走到门口,每走一步是1s。
这道题写了几次WA了,后面发现自己还是不太会剪枝,学了网上的代码懂了很多,但还是WA,代码甚至完全一样还是WA,查了半天没有找到不一样的,后面发现是输入问题,我用的是scanf("%c", &map[i][j]);而且我也处理了缓冲区问题,后面把输入该了就过了,下次遇到这个字符输入还是首选cin吧。
贴代码:
#include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; char map[10][10]; int n, m, mark, step, finishx, finishy; int dir[4][2]={0, -1, 0, 1, 1, 0, -1, 0}; void DFS(int startx, int starty, int counting) { int temp, x, y; if(startx<1 || startx>n || starty<1 || starty>m) return ; if(startx == finishx && starty == finishy && counting == step) { mark = 1; return ; } temp = (step-counting)-abs(startx-finishx)-abs(starty-finishy); //判断剩余的步数是否为偶数或大于0 if(temp<0 || temp&1) return ; for(int i = 0; i<4; i++) { x = startx+dir[i][0]; y = starty+dir[i][1]; if(map[x][y] != ‘X‘) { map[x][y] = ‘X‘; DFS(x, y, counting+1); if(mark) return; map[x][y] = ‘.‘; } } return; } int main() { int startx, starty, wall; while(scanf("%d%d%d", &n, &m, &step)!=EOF) { if(n==0 && m==0 && step==0) break; mark = 0; wall = 0; for(int i = 1; i<=n; i++) { //getchar(); for(int j = 1; j<=m; j++) { //scanf("%c", &map[i][j]); cin>>map[i][j]; //注意这里一个坑,用cin吧 if(map[i][j] == ‘S‘) { startx = i; starty = j; } if(map[i][j] == ‘D‘) { finishx = i; finishy = j; } if(map[i][j] == ‘X‘) wall++; } } if(m*n-wall <= step) { printf("NO\n"); continue; } map[startx][starty] = ‘X‘; DFS(startx, starty, 0); if(mark) printf("YES\n"); else printf("NO\n"); } return 0; }
hdu 1010 Tempter of the Bone (DFS+剪枝),布布扣,bubuko.com
hdu 1010 Tempter of the Bone (DFS+剪枝)
标签:des style blog java color strong
原文地址:http://www.cnblogs.com/fengxmx/p/3853048.html