hdoj 1016 素数环

DFS1
#include<iostream>
using namespace std;

int n, pre;
int vis[23];
int p[23];
int cnt;
int kcase;
bool isPrime(int num){
	for(int i = 2; i*i <= num; ++i){
		if(num%i == 0)
			return false;
	}
	return true;
}

void dfs(int cur, int pre, int s){
	if(!isPrime(cur+pre)) 
		return;
	if(s == n && isPrime(cur+1)){
		int flag = 1;
		for(int i = 0; i < n; ++i){
			if(flag){
				cout << p[i]; 
				flag = 0;
			}
			else{
				cout <<" "<<p[i];
			}
		}
		cout <<endl; 
		return ;	
	}
	for(int i = 1; i <= n; ++i){
		if(!vis[i]){
			vis[i] = 1;
			p[s] = i;
			dfs(i, cur, s+1);
			vis[i] = 0;
		}
	}
	
}

int main()
	{
	//	freopen("C:\\Users\\zhangwei\\Desktop\\in.txt","w",stdout);
		while(scanf("%d",&n)!=EOF){
			vis[1] = 1;
			p[0] = 1;
			printf("Case %d:\n",++kcase);
			dfs(1,0,1); 
			printf("\n");
		}
		return 0;
	}

采用数组 记录 类似八皇后处理 正确性是基于 p数组 随着深度变化 不断被改变

DFS2

void dfs(int s){
	if(s == n && isPrime(p[s-1]+1)){
		int flag = 1;
		for(int i = 0; i < s; ++i){
			if(flag){
				cout << p[i]; 
				flag = 0;
			}
			else{
				cout <<" "<<p[i];
			}
		}
		cout <<endl; 
		return ;	
	}
	for(int i = 2; i <= n; ++i){
		if(!vis[i]){
			if(isPrime(p[s-1]+i)){
				vis[i] = 1;
				p[s++] = i;//这里注意 必须先s++ 不可以 p[s] 后 dfs (s+1) 
				dfs(s);
				vis[i] = 0;
				--s;
			}
		}
	}
	
}
第二种DFS一定注意  s++ 位置 如果采用dfs(s+1)则 当s+1 == n时候 s == n-1  此时回退到起点 s将退为0 而不是1


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值