hdoj 1016 素数环

来源:互联网 发布:易语言数据库排序 编辑:程序博客网 时间:2024/06/05 06:33
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


原创粉丝点击