poj 3009 冰壶 DFS 一个方向搜查到底
2014-04-11 10:39
453 查看
题意:
冰壶可以上下左右运动(前提上下左右的第一个位置为空)。碰到冰块则停止,冰块也将被破坏。问懂多少次能达到终点。
一个方向搜到底:
代码:
冰壶可以上下左右运动(前提上下左右的第一个位置为空)。碰到冰块则停止,冰块也将被破坏。问懂多少次能达到终点。
一个方向搜到底:
代码:
#include <iostream> #include <algorithm> using namespace std; int map[30][30]; int w,h; int minn=300000; void dfs(int x,int y,int sum,int a,int b) //a,b记录下一次运动的方向。 { if(x<0||x>=h||y<0||y>=w||sum>10) return ; if(map[x][y]==3) { minn=min(sum,minn); return ; } if(map[x+a][y+b]==0||map[x+a][y+b]==3)//如果下一次为空,接着运动。 dfs(x+a,y+b,sum,a,b); else if(map[x+a][y+b]==1) //否则,停止,换方向。 { map[x+a][y+b]=0; if(map[x+1][y]!=1) dfs(x,y,sum+1,1,0); if(map[x-1][y]!=1) dfs(x,y,sum+1,-1,0); if(map[x][y+1]!=1) dfs(x,y,sum+1,0,1); if(map[x][y-1]!=1) dfs(x,y,sum+1,0,-1); map[x+a][y+b]=1; } } int main() { while(cin>>w>>h&&w&&h) { minn=300000; int x,y; memset(map,0,sizeof(map)); //郁闷。没初始化,WA一次。 for(int i=0;i<h;i++) for(int j=0;j<w;j++) { cin>>map[i][j]; if(map[i][j]==2) { map[i][j]=0; x=i; y=j; } } if(map[x+1][y]!=1) //判断能否运动。 dfs(x,y,1,1,0); if(map[x-1][y]!=1) dfs(x,y,1,-1,0); if(map[x][y+1]!=1) dfs(x,y,1,0,1); if(map[x][y-1]!=1) dfs(x,y,1,0,-1); if(minn<=10) cout<<minn<<endl; else cout<<"-1\n"; } return 0; }
相关文章推荐
- poj 3009 冰壶 dfs
- poj 3009 Curling 2.0(冰壶 直到遇到障碍才停下 dfs)
- poj 3009 Curling 2.0 dfs
- POJ训练计划3009_Curling 2.0(DFS)
- poj 3009 Curling 2.0 DFS
- POJ 3009 Curling 2.0(DFS深度优先搜索)
- POJ-3009-Curling 2.0- DFS
- POJ 3009 Curling 2.0(DFS)
- poj 3009 Curling 2.0 【dfs经典题目】
- POJ 3009 Curling 2.0 回溯,dfs 难度:0
- DFS poj 3009
- poj 3009 冰壶游戏隐式图搜索
- poj_3009 Curling 2.0(dfs)
- poj 3009 dfs
- POJ 3009 用DFS搜最短路径 适合用来学习DFS
- 【DFS】POJ-3009 冰壶游戏
- poj3009 Curling2.0 (dfs)
- Curling 2.0 POJ - 3009 dfs
- poj3009之深度优先搜索 dfs解法
- POJ - 3009 Curling 2.0解题报告(dfs)