POJ 3009 Curling 2.0(简单DFS)
生活随笔
收集整理的這篇文章主要介紹了
POJ 3009 Curling 2.0(简单DFS)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
每一次碰到障礙則在障礙的旁邊停下來,并且障礙被擊碎。此時可以重新值擲一次冰球。當擲球次數超過 10 次則輸出 -1。
思路:
1. 超過 10 次輸出 -1 這個剪枝很關鍵;
2. 主要是要注意些邊界條件,初始化的情況,代碼最終跑了 250ms,比較差,就不多說了。
?
#include <iostream> #include <algorithm> using namespace std;const int INFS = 0x3fffffff; int grid[25][25], row, col, ans; int dir[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1};inline bool judge(int x, int y) {if (0 < x && x <= row && 0 < y && y <= col) {return true;}return false; }void dfs(int x, int y, int step) {if (step > 10)return ;for (int i = 0; i < 4; ++i) {int a = x, b = y, cflag = 0;while (judge(a, b)) {a += dir[i][0];b += dir[i][1];cflag += 1;if (grid[a][b] == 3) {ans = min(ans, step + 1);return ;}if (grid[a][b] == 1) break ;}if (grid[a][b] == 1 && cflag > 1) {grid[a][b] = 0;dfs(a-dir[i][0], b-dir[i][1], step+1);grid[a][b] = 1;}} }int main() {while (scanf("%d%d", &col, &row) && col && row) {int x, y;memset(grid, 0, sizeof(grid));for (int i = 1; i <= row; i++) {for (int j = 1; j <= col; j++) {scanf("%d", &grid[i][j]);if (grid[i][j] == 2) x = i, y = j;}}ans = INFS;dfs(x, y, 0);if (ans <= 10)printf("%d\n", ans);elseprintf("-1\n");} }轉載于:https://www.cnblogs.com/kedebug/archive/2013/03/18/2966997.html
總結
以上是生活随笔為你收集整理的POJ 3009 Curling 2.0(简单DFS)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C】——C项目中的菜单功能(源码)
- 下一篇: 【原创】锐捷交换机实现双星型拓扑网络(链