浅浅写一下dfs。
目录
基本模板:
一般情况输出的都是结果种数,所以有输出其他的自己再修改就可了。
int v[N]={0); //用作标记
void dfs(int w){
//判断越界与否
if(){
return;
}
//递归出口,合题的话计数加一
if(){
cnt++;
return;
}
//普通情况,继续递归
else{
v[w]=1; //标记本次遍历
dfs(w++);
v[w]=0; //回溯
}
}
int main(){
//递归入口,注意判断入口有多少种可能
dfs(0);
//打印结果
printf("%d",cnt);
return 0;
}
题目一 路径计数:
从一个 5×5 的方格矩阵的左上角出发,沿着方格的边走,满足以下条件的路线有多少种?
- 总长度不超过 12;
- 最后回到左上角;
- 路线不自交;
- 不走出 5×5 的方格矩阵范围之外。 如下图所示,ABC 是三种合法的路线。注意 B 和 C 由于方向不同,所以 视为不同的路线。
注:我们每次都是从左上角出发,所以入口只有一个,就不用再枚举了。
#include<bits/stdc++.h>
using namespace std;
//递归方向数组,也可以写成两个
int d[4][2]={
{1,0},
{-1,0},
{0,1},
{0,-1}
};
int sum=0;
int v[5