DFS的基本操作

题目

 

 

 

 

分析

DFS可以利用栈实现,原理即后进先出;

本代码利用递归调用实现,在每次判断没有达到结束条件时继续对每一种可能进行判断

 

解答

/*
-------------------------------------------------
   Author:       wry
   date:         2022/2/28 17:18
   Description:  DFS
-------------------------------------------------
*/

#include <bits/stdc++.h>

using namespace std;

int direction[8][2] = {{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};

const int MAXN = 30;

bool visit[MAXN][MAXN];     //判断有没有访问过

int p,q;     //棋盘大小

bool DFS(int x,int y,int step,string answer) {
    //1.如果步数等于棋盘大小,表示全部都已经访问过了
    if(step == p*q) {
        cout << answer << endl;
        return true;      //返回true
    }
    //2.如果步数还没有走完整个棋盘,则对各个方向进行处理
    for (int i=0;i<8;i++) {
        int newx = x + direction[i][0];
        int newy = y + direction[i][1];
        //3.如果出错或者已经检查过,则跳过不处理
        if (newx<0 || newx>p || newy<0 || newy>q || visit[newx][newy]) {
            continue;
        }
        //4.如果没有错且没有检查过,则进行处理,并置为已检查
        visit[newx][newy] = true;
        string row = "0" + newy; //
        string col = "A" + newx;
        //5.如果一路到头,走完整个棋盘,则会在一个if返回true,并在下面的这个if一直返回true,一直到最外层返回true
        if (DFS(newx,newy,++step,answer+col+row)) {
            return true;
        }
        //6.如果本次组合不能实现走完整个棋盘,则将此点置为没有检查过,并继续尝试下一个可能的循环
        visit[newx][newy] = false;
    }
    //7.如果一直到最后都没有成功的,则返回false
    return false;
}

int main() {
    int n;
    cin>>n;
    while (n--) {
        cin >> p >> q;
        memset(visit,false,sizeof(visit));   //初始化
        visit[0][0] = true;  //默认已经检索起点
        if(DFS(0,0,1,"A1")) {    //开始时,已经检查了起始点,且初始字符串为A1
            continue;
        }
        else {
            cout << "impossible" << endl;
        }
    }
    return 0;
}

 本代码中很巧妙的是其true和false的返回

memset的初始化也可以用于bool类型

posted @ 2022-02-28 20:04  火星架构师  阅读(61)  评论(0编辑  收藏  举报