1.输出存在任意路径
达到递归出口时,如果符合条件就输出并return true
bool dfs(int x,int y,int cnt)
{
if(cnt == p * q){
//这里输出,或者在main函数中输出
return true;
}
for (int i = 0; i < 8; i ++) {
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if(tx <= 0 || tx > p || ty <= 0 || ty > q) continue;
if(!mp[tx][ty]){
mp[tx][ty] = cnt + 1;
if(dfs(tx, ty, cnt + 1)){//!如果往这个方向走最后能找到,就加入路径
path[sz ++] = {tx,ty};
return true;
}
mp[tx][ty] = 0;
}
}
return false;
}
2.要求找到最有解,那必须跑完所有的情况,不能return只是在递归出口处判断解是否更优
void dfs(int rl,int lr,int lh,int rv,int s)
{
if(rl == 0){
if(rv == 0) ans = ans == 0 ? s : min(ans,s);
return;
}
if(rv < rl * rl * (rl + 1) * (rl + 1) / 4) return;//1^3+2^3+3^3+…+n^3=n2(n+1)2/4
if(ans && s + 2 * (rl) * (rl + 1) * (2 * rl + 1) / 6 > ans) return;//n(n+1)(2n+1)/6
if(rl * (lr - 1) * (lr - 1)* (lh - 1) < rv) return;
for (int r = lr - 1; r >= rl; r --) {
for (int h = lh - 1; h >= rl; h --) {
dfs(rl - 1, r, h, rv - r * r * h, s + 2 * r * h );//+ (rl == m ? r * r : 0)
}
}
}
3.输出所有路径每找到一种情况就输出
void dfs(int x,int cnt)
{
if(cnt == n){
if(mp[x][s]) print_path();//如果符合,就输出路径
return;
}
for (int i = 1; i <= n; i ++) {
if(i == x) continue;
if(mp[x][i] && !vis[i]){
vis[i] = 1;
ans[sz ++] = i;//不论是否能到达终点,都先放入路径
dfs(i, cnt + 1);
vis[i] = 0;
sz --;//从路径中取出该点
}
}
}