奇怪代码!!

P1219 [USACO1.5] 八皇后 Checker Challenge

wyz0326 @ 2024-11-08 22:37:57

我忘记写return了 但它AC了

#include<bits/stdc++.h>
using namespace std;
int a[130];
bool h[130],l[130],r[130];
int tot=0;
int n;
void dfs(int i){
    if(i>n){

        if(tot<=2){
            for(int k=1;k<=n;k++){
                cout<<a[k]<<" ";
            }
            cout<<endl;
        }   
        tot++;
    }
    for(int j=1;j<=n;j++){
         if((!h[j])&&(!l[i+j])&&(!r[i-j+n])){
            a[i]=j;
            h[j]=1;
            l[i+j]=1;
            r[i-j+n]=1;
            dfs(i+1);
            h[j]=0;
            l[i+j]=0;
            r[i-j+n]=0;
         }

    }
}
int main(){
    cin>>n;
    dfs(1);
    cout<<tot;
    return 0;
}

就离谱


by wzh11223344 @ 2024-11-08 22:40:01

我嘞个ac啊


by Zhengjingwen_mc @ 2024-11-08 22:44:20

@wyz0326 对,这个dfs其实不用retrun ,原因: 1.他不是递归函数; 2.并没有用到他的返回值


by wyz0326 @ 2024-11-08 22:59:54

@Zhengjingwen_mc 我有一点不理解的是理论上来说它就不应该跑出来啊,感觉它应该是一直卡着


by wyz0326 @ 2024-11-08 23:00:48

@Zhengjingwen_mc 有递归的部分


by wallace_QwQ @ 2024-11-08 23:13:02

八皇后问题的话,尽头会因为无法通过

if((!h[j])&&(!l[i+j])&&(!r[i-j+n])){

而自动返回吧


by Zhengjingwen_mc @ 2024-11-09 12:58:35

@wyz0326 没看到递归啊


by wyz0326 @ 2024-11-09 21:40:41

@Zhengjingwen_mc

for(int j=1;j<=n;j++){
         if((!h[j])&&(!l[i+j])&&(!r[i-j+n])){
            a[i]=j;
            h[j]=1;
            l[i+j]=1;
            r[i-j+n]=1;
            dfs(i+1);
            h[j]=0;
            l[i+j]=0;
            r[i-j+n]=0;
         }

    }

第七行


by Zhengjingwen_mc @ 2024-11-15 09:09:44

@wyz0326 有没有一种可能,在一次递归中不符合if条件,所以没有继续递归(因为你的递归在if里面)


by wyz0326 @ 2024-11-15 18:58:40

@Zhengjingwen_mc 悟了


|