poj 3009 Curling 2.0 (dfs的应用)
生活随笔
收集整理的這篇文章主要介紹了
poj 3009 Curling 2.0 (dfs的应用)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?http://poj.org/problem?id=3009
(1)這是一個用球撞石頭的游戲,撞到石頭,石碎球停。在規定的10次拋球機會下,若求移動到終點就贏,否則算輸了(出界直接算輸)。
(2)每一次的深搜都有四個方向,每個方向要一直走,直到出現以下狀況為止:
1)剛要拋球,被墻擋住了(該情況不能拋球);
2)? 出界;
3)到達終點;
4) 撞墻。
其中只有第四種情況需要進行深搜,其他情況均不需要。(雖然這很顯然,但是案例
通不過的基本上就是因為這個,千萬小心)。
(3)通過了所有案例,為什么還是WA??小心,注意輸入 n,m 順序問題。題中所給的案例
恰好與n,m 的順序無關。。。這是挖好了陷阱等你呢。
(4)稍微注意: if(!n&&!m) break;
總的來說,這是一道不錯的dfs入門題。
具體代碼:
View Code #include<stdio.h> #include<string.h> #define Inf (1<<28) int n, m; int map[25][25]; int dir[4][2]={1,0,0,1,-1,0,0,-1}; int px, py, ans; int dfs(int x, int y, int depth) {int i, j, k;if(depth>10) return 0;for(i=0;i<4;i++){int tx=x, ty=y, ex, ey;int g=0;for(j=0;;j=1){ex=tx+dir[i][0];ey=ty+dir[i][1];if(!j&&map[ex][ey]==1) break; //靠墻,不能投if(ex<=0||ex>n||ey<=0|ey>m) break; //出界if(map[ex][ey]==3) //終點 {if(ans>depth) ans=depth;return 0;}if(map[ex][ey]==1) {g=1; break;}//撞墻tx=ex; ty=ey;//球還在滾動中 }if(g){map[ex][ey]=0;dfs(tx, ty, depth+1); //下一步,只有撞墻的才算一步map[ex][ey]=1;}}return 0; } int main() {int i, j, k;while(scanf("%d%d", &m, &n)!=EOF, n||m) //注意 n, m 的順序 {for(i=1;i<=n;i++)for(j=1;j<=m;j++){scanf("%d", &map[i][j]);if(map[i][j]==2) {px=i;py=j;}}ans=Inf;dfs(px, py, 1);if(ans!=Inf) printf("%d\n", ans);else printf("-1\n");}return 0; }?
?
?
轉載于:https://www.cnblogs.com/tim11/archive/2012/08/18/2645715.html
總結
以上是生活随笔為你收集整理的poj 3009 Curling 2.0 (dfs的应用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息系统项目管理系列之九:项目质量管理
- 下一篇: Windows远程桌面开发之九-虚拟显示