1 条题解

  • 0
    @ 2025-3-9 19:47:29

    额这是本蒟蒻发的第一篇题解,请大佬、巨佬多多指教(*^_^*)(p≧w≦q) 根据题意,输入n和k,输出排列方式,如: 3 2 输出: 1 2 1 3 2 1 2 3 3 1 3 2 也就是同学们序号不能重复撒(同学们也不会分身术依~~万一是孙悟空呢) 所以,用vis数组就行啦😜(标记数组,其他名字也可以,看懂就行) 请问,函数怎么写呢?

    void dfs(int k) {
    	if (k==c+1) {
    		for(int i=1;i<=c;i++) {
    			cout<<a[i]<<" ";
    		}
    		cout<<endl;
    		return;
    	}
    	for (int i=1;i<=n;i++) {
    		if (!u[i]) {
    			u[i]=1;
    			a[k]=i;
    			dfs(k+1);
    			u[i]=0;
    		}
    
    	}
    }
    

    一定要回溯!否则程序运行: 1 2; 3; 没了! dfs函数 一层一层往里搜,再看有没有满足,不能重复。 一定从1开始,还要标记,for循环就是用来找的,因为可以倒过来。 return别忘记。 下面,为您奉上代马: 哦不,是代🐎:

    #include<bits/stdc++.h>
    using namespace std;
    int n,c;
    int a[15];
    int u[15];
    void dfs(int k) {
    	if (k==c+1) {
    		for(int i=1;i<=c;i++) {
    			cout<<a[i]<<" ";
    		}
    		cout<<endl;
    		return;
    	}
    	for (int i=1;i<=n;i++) {
    		if (!u[i]) {
    			u[i]=1;
    			a[k]=i;
    			dfs(k+1);
    			u[i]=0;
    		}
    
    	}
    }
    
    int main() {
    	cin>>n>>c;
    	dfs(1);
    	return 0;
    }
    
    

    由于最多顶多10,可以设成11; 从一开搜; 从一开始要设置k==c+1; 好了,完结撒花!

    拜拜

    信息

    ID
    2745
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    30
    已通过
    18
    上传者