深度优先搜索1-A Knight's Journey(算法基础 第6周)

问题描述:
深度优先搜索1-A Knight's Journey(算法基础 第6周)_第1张图片
深度优先搜索1-A Knight's Journey(算法基础 第6周)_第2张图片
分析
题目挺难理解的,参考:https://www.slyar.com/blog/poj-2488-c.html
源码

#include<iostream> 
#include <cstring>
using namespace std;  

const int MAX=27;
bool map[MAX][MAX];
int dx[8]={-2, -2, -1, -1, 1, 1, 2, 2};  //按字典序方向行走
int dy[8]={-1, 1, -2, 2, -2, 2, -1, 1};
char path[MAX*MAX*2];
bool succ;
int p, q;
int steps;

void dfs(int x, int y) {
    if (succ) {   // 如果已经遍历完成则直接返回
        return;
    }
    map[x][y] = true;  //置已访问标记
    path[steps++] = x+'A'-1; //记录当前坐标
    path[steps++] = y+'0';

    if (steps == p*q*2) {  //当步数等于棋盘格子数则成功
        succ = true;
        return;
    }

    for (int i=0; i<8; i++) {  //访问所有走的可能性
        int newx=x+dx[i];
        int newy=y+dy[i];

        if ((newx>0 && newx<=q && newy>0 && newy<=p && !map[newx][newy]) && !succ)
        {
            dfs(newx, newy);
            steps -= 2;
            map[newx][newy]=false;
        }
    }
}

int main(){  
    int cases, i=0;
    cin >> cases;

    while(cases--) {
        cin >> p >> q;

        memset(map, false, sizeof(map));
        memset(path, 0, sizeof(path));
        steps=0;
        succ = false;

        dfs(1, 1);

        cout << "Scenario #" << ++i << ":" << endl; 
        if (succ){
            cout << path << endl << endl;
        } 
        else{
            cout << "impossible" << endl << endl;
        }
    }
    return 0;  
}  

你可能感兴趣的:(深度优先搜索1-A Knight's Journey(算法基础 第6周))