当前位置: 代码迷 >> 综合 >> 【 UVA - 524 】Prime Ring Problem 素数环(DFS回溯)
  详细解决方案

【 UVA - 524 】Prime Ring Problem 素数环(DFS回溯)

热度:13   发布时间:2024-02-06 11:23:55.0

题目传送

代码:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
typedef long long ll;
using namespace std;
int n,cnt=0,a[20]={1}; //a数组记录环,第一个数是1 
bool vis[20]={false};  //标记是否取过 bool is(int x)  //判断素数 
{if(x<2) return 0;for(int i=2;i*i<=x;i++)if(x%i==0) return 0;return 1;
}void dfs(int num)  
{	if(num==n) //已找到n个数 {if(is(1+a[n-1]))  //第一个数和最后一个数之和也要是素数 {printf("%d",a[0]);for(int i=1;i<n;i++) printf(" %d",a[i]); //输出 printf("\n");}return;}for(int i=2;i<=n;i++){if(!vis[i] && is(a[num-1]+i)) //没访问过,与上一个数之和为素数 {a[num]=i;vis[i]=1;dfs(num+1);vis[i]=0; //回溯 取出数 a[num]=0; //这步应该无所谓(可省) }}
}int main() 
{    while(cin>>n){if(cnt) printf("\n");printf("Case %d:\n",++cnt);dfs(1); //数组0已经放了1,从数组下标1开始dfs }return 0;
}

这无语的格式错误
在这里插入图片描述

  相关解决方案