实训第二天,没午睡,看VC,学MFC框架,敲代码..累啊.上回来不能休息,还要看算法。。。。撑着. 状态不这么好,丢三落四的,本来比较简单的一道,WA了好多次. #include <stdio.h> int w,h; #define MAX_N 300 int map[MAX_N][MAX_N]; int sr,sc; bool inside(int r,int c){ return (r >= 1 && r <= h && c >= 1 && c <= w) ? true : false; } int d[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; int MIN; //诶,读题目不仔细,把题目读难了,以为在碰到箱子的时候要转方向的,那比这个要稍微复杂点.。。。 void dfs(int cur, int r,int c) { //当前次数 当前位置 cur++; //超过10 次 上界剪枝 if (cur > 10) return ; //比当前最小转向次数少,剪枝 if(cur > MIN) return ; int i,nr,nc; for (i = 0;i < 4;i++) { nr = r + d[i][0]; nc = c + d[i][1]; if (map[nr][nc] != 1 && inside(nr,nc)/* && map[nr][nc] != 3*/) { while (map[nr][nc] != 3 && map[nr][nc] != 1 && inside(nr,nc)) { nr += d[i][0]; nc += d[i][1]; } //出界,当前选择不可行 if(!inside(nr,nc)) continue; else if (map[nr][nc] == 3) //目标点 { if (cur < MIN) MIN=cur; return ; } else if (map[nr][nc] == 1) { map[nr][nc]=0; //退一步,重新判断方向 dfs(cur,nr-d[i][0],nc-d[i][1]); //回溯 恢复箱子 map[nr][nc]=1; } } } return ; } int main() { //freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); int i,j; while (scanf("%d%d",&w,&h)) { if(w == 0 && h == 0) break; for(i = 1;i <= h;i++) for(j = 1;j <= w;j++){ scanf("%d",&map[i][j]); if(map[i][j] == 2) { sr = i; sc = j; } } /* for(i = 1;i <= h;i++){ for(j = 1;j <= w;j++) printf("%d ",map[i][j]); printf("/n"); } */ MIN = 1000; dfs(0,sr,sc); if (MIN < 11) printf("%d/n",MIN); else printf("-1/n"); } return 0; } /* 给组数据~~ 20 20 0 1 0 0 0 0 1 0 1 0 0 1 0 2 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 3 0 1 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 1 0 1 1 0 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 0 1 0 1 1 1 0 1 0 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 1 1 0 1 */