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类型