首页 > 学院 > 开发设计 > 正文

poj 3009 Curling 2.0(dfs)

2019-11-08 19:46:59
字体:
来源:转载
供稿:网友

第二次做在某个方向上的深搜,第一次做是是杭电oj上的那个连连看,当时看了题解也没看懂,现在这个不看题解也可以搞的出来了,挺高兴的。 不过题目的意思还是看的题解,有些地方翻译不过来。。。。。。

题解:http://blog.csdn.net/lyy289065406/article/details/6647671

#include <cstdio>#include <cstring>#define MAXN 22//网格中1表示石头,不能走int w,h;int g[MAXN][MAXN];int sx,sy,ex,ey,res;int next[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; //0 上 1 下 2 左 3 右void dfs(int tx, int ty, int dir, int cnt, int flag){ if(cnt > 10 || cnt > res) return; if(tx == ex && ty == ey) { if(cnt < res) res = cnt; return; } int nx = tx + next[dir][0]; int ny = ty + next[dir][1];//要移动的下一个格子的行号和列号 //先判断边界 if(nx < 0 || ny < 0 || nx >= h || ny >= w) return; //再判断下个格子有没有石头 //如果下个格子是石头,并且冰壶是动态的,则向其他几个方向移动 if(g[nx][ny] == 1 && flag) { g[nx][ny] = 0;//石头被碰掉了 for(int i = 0; i < 4; ++i) { //if(i != dir) dfs(tx,ty,i,cnt+1,flag^1);//碰到石头了,成静态了 } g[nx][ny] = 1; } else if(g[nx][ny] == 1 && !flag)//如果下一个格子是个石头,并且冰壶是静态的,返回 { return; } else//没有碰到石头,则继续在这个方向移动 { if(!flag)//如果冰壶是静态的,状态转换为动态 dfs(nx,ny,dir,cnt,flag^1); else dfs(nx,ny,dir,cnt,flag); }}int main(){ while(scanf("%d %d",&w,&h) && w+h) { res = 9999999; for(int i = 0; i < h; ++i) for(int j = 0; j < w; ++j) { scanf("%d",&g[i][j]); if(g[i][j] == 2) { sx = i; sy = j; g[i][j] = 0; } if(g[i][j] == 3) { ex = i; ey = j; g[i][j] = 0; } } for(int i = 0; i < 4; ++i) dfs(sx,sy,i,1,0);//标记0用于标记冰壶是动态还是静态,静态为0,动态为1 if(res > 10) PRintf("-1/n"); else printf("%d/n",res); } return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表