【題解】ZeroJudge c145: 105北二3蛇行兜風怪客

題目敘述:https://zerojudge.tw/ShowProblem?problemid=c145
解題想法:DFS + Backtracking

  • 題目規定一律採蛇行路線,也就是往前一格,接下來就一定要左轉或右轉。也就是每次輪流沿 x 方向或 y 方向移動。
  • 函數 dfs( ) 多用了一個參數 d,用來記錄移動方向(direction)。
  • main( ) 呼叫兩次 dfs( ),一次先沿著 x 方向移動,另一次則沿著 y 方向移動,計算出最長的兜風路徑。
#include <iostream>
using namespace std;

int n, m, maxi, a[11][11];

void dfs(int x, int y, int d, int steps){
    if (d == 0){
        if ((x+1 < n && a[x+1][y]==0)|| (x-1 >= 0 && a[x-1][y]==0)){
            if (x+1 < n && a[x+1][y]==0){
                a[x+1][y] = 1;
                dfs(x+1, y, 1, steps+1);
                a[x+1][y] = 0;
            }
            if (x-1 >= 0 && a[x-1][y]==0){
                a[x-1][y] = 1;
                dfs(x-1, y, 1, steps+1);
                a[x-1][y] = 0;
            }
        }else{
            if (steps > maxi) maxi = steps;
        }
    }
    else if (d == 1){
        if ((y+1 < m && a[x][y+1]==0)|| (y-1 >= 0 && a[x][y-1]==0)){
            if (y+1 < m && a[x][y+1]==0){
                a[x][y+1] = 1;
                dfs(x, y+1, 0, steps+1);
                a[x][y+1] = 0;
            }
            if (y-1 >= 0 && a[x][y-1]==0){
                a[x][y-1] = 1;
                dfs(x, y-1, 0, steps+1);
                a[x][y-1] = 0;
            }
        }else{
            if (steps > maxi) maxi = steps;
        }
    }
}

int main(){
    while (cin >> n >> m){
        maxi = 0;
        dfs(0, 0, 0, 1);
        dfs(0, 0, 1, 1);
        cout << maxi << "\n";
    }
}
分享本文 Share with friends