【C/C++】全排列及素数环问题

news/2024/7/20 22:24:40 标签: 深度优先, dfs, 素数环

全排列

问题描述:将n个互不相同的数全排列,即1,2,······n
方法:dfs

算法思路:

dfs(从第一层开始){
    if(递归结束条件){
        遍历a[i]
    }
    打印换行
    for(循环n个位数) {
        if(当前数字没用过){
            第k层(第k个位置)填数字i
            标记置为1
            进入下一层
            标记重新置0
        }
    }
}

代码:

#include<stdio.h>

int n,flag[100],a[100];
void dfs(int k){
    if(k==n+1){   //递归结束条件,当到达第n+1层,代表第n层已经填完
        for(int i=1;i<=n;i++){
            printf("%d ",a[i]);
        }
        printf("\n");
    }
    for(int i=1;i<=n;i++){  //n个数字 
        if(flag[i]==0){  //当前数字没用过才可以排列
            a[k]=i;      //第k层(第k个位置)填数字i
            flag[i]=1;   //该数已经用过,置为1
            dfs(k+1);    //填下一层(下一个位置)
            flag[i]=0;   //递归回来的时候需要重新置为0 
        }
    }
}
int main()
{
	scanf("%d",&n);
	dfs(1);     //从第一层(第一个位置)开始排列 
	return 0;
}

n个数选m个数全排列

#include<stdio.h>

int n,m,flag[100],a[100];
void dfs(int k){
    if(k==m+1){   //递归结束条件,当到达第n+1层,代表第n层已经填完
        for(int i=1;i<=m;i++){
            printf("%d ",a[i]);
        }
        printf("\n");
    }
    for(int i=1;i<=n;i++){  //n个数字
        if(flag[i]==0){  //当前数字没用过才可以排列
            a[k]=i;      //第k层(第k个位置)填数字i
            flag[i]=1;   //该数已经用过,置为1
            dfs(k+1);    //填下一层(下一个位置)
            flag[i]=0;   //递归回来的时候需要重新置为0
        }
    }
}
int main()
{
	scanf("%d %d",&n,&m);
	dfs(1);     //从第一层(第一个位置)开始排列
	return 0;
}

n个不同的元素,任取m个数进行组合。(组合无序)

#include<stdio.h>

int n,m;
int a[1000];

void dfs(int k){
	if(k==m+1){  //递归结束条件,当到达第m+1层,代表第m层已经填完
		for(int i=1;i<=m;i++){
			printf("%d ",a[i]);
		}
		printf("\n");
	}
	//当前位置数值比前一个数至少大1,a[k]代表当前位置上的值,它的范围是[a[k-1]+1,n]
	for(int i=a[k-1]+1;i<=n;i++){
		a[k]=i;   //第k层(第k个位置)填数字i
		dfs(k+1);    //填下一层(下一个位置)
	}
}

int main(){
	scanf("%d %d",&n,&m);
	dfs(1);  //从第一层(第一个位置)开始排列
	return 0;
}

素数环

题目:
素数环:把从 1 到 n 这 n 个数摆成一个环,要求相邻两个数的和是一个素数,编
程求出所有解法。

#include<stdio.h>
#include<math.h>

int n=6;
int flag[100],a[100];
int exist = 0;

int prime(int n){
    for(int i=2;i<=sqrt(n);i++){
        if(n%i==0){
            return 0;
        }
    }
    return 1;
}

void dfs(int k){
    if(k==n+1 && prime(a[1]+a[k])){
        for(int j=1;j<=n;j++){
            printf("%d",a[j]);
            exist = 1;
        }
        printf("\n");
    }
    else{
        for(int i=1;i<=n;i++){
            if(flag[i]==0 && (k==1 || prime(i+a[k-1]))){
                a[k]=i;
                flag[i]=1;
                dfs(k+1);
                flag[i]=0;
            }
        }
    }
}

int main(){
	dfs(1);
	if(flag == 0)
        printf("无解");
	return 0;
}

以上属个人见解。
❤️希望对您有帮助,您的支持是我创作最大的动力!


http://www.niftyadmin.cn/n/5199680.html

相关文章

揭开副业的神秘面纱,上班摸鱼搞副业

副业没那么神秘&#xff0c;说白了就是销售。 卖文字、卖知识、卖技能、卖产品 ... 找对了渠道&#xff0c;有人愿意买单&#xff0c;就成了副业。 但是现在搞副业&#xff0c;坑多水深的&#xff0c;太多人栽跟头了&#xff0c;丢几百块都能算少的。 开始细说干货之前&#…

HEVC参考帧技术

为了增强参考帧管理的抗差错能力&#xff0c;HEVC采用了参考帧集技术&#xff0c;通过直接在每一帧的片头码流中传输DPB中各个帧的状态变化&#xff0c;将当前帧以及后续帧可能用到的参考帧在DPB中都进行描述&#xff0c;描述以POC作为一帧的身份标识。因此&#xff0c;不需要依…

【CSS】min 和 max 函数(设置最大最小值)

文章目录 min() 函数&#xff1a;允许你从逗号分隔符表达式中选择一个最小值作为 CSS 的属性值 width: min(1vw, 4em, 80px);max() 函数&#xff1a;让你可以从一个逗号分隔的表达式列表中选择最大&#xff08;正方向&#xff09;的值作为属性的值 width: max(10vw, 4em, 80p…

批量检查多台服务器 高亮打印每个IP 绿底红字

批量检查多台服务器 高亮打印每个IP 绿底红字 for i in $(cat 22.txt); do echo -e "\033[42;31m$i\033[0m"; ssh root$i "ifconfig"; done

同时创建多个websoket(初始化多个链接、重连、定时发消息、存储接收的数据)

1.下边的例子演示了创建10个WebSocket 实例&#xff0c;当其中某一个连接失败时&#xff0c;会自动进行重连 class WebSocketConnection {constructor(url) {this.url url;this.ws new WebSocket(url);this.bindEvents();}bindEvents() {this.ws.onopen () > {console.l…

中间件安全:Apache Tomcat 文件上传.(CVE-2017-12615)

中间件安全&#xff1a;Apache Tomcat 文件上传. 当存在漏洞的 Tomcat 运行在 Windows / Linux 主机上&#xff0c;且启用了 HTTP PUT 请求方法(例如&#xff0c;将 readonly 初始化参数由默认值设置为ialse) &#xff0c; 攻击者将有可能可通过精心构造的攻击请求数据包向服务…

封神测评:腾讯云服务器CVM标准型S5实例CPU内存带宽系统盘

腾讯云服务器CVM标准型S5实例具有稳定的计算性能&#xff0c;CVM 2核2G S5活动优惠价格280.8元一年自带1M带宽&#xff0c;15个月313.2元、2核4G配置748.2元15个月&#xff0c;CPU内存配置还可以选择4核8G、8核16G等配置&#xff0c;公网带宽可选1M、3M、5M或10M&#xff0c;腾…