素数环:NYOJ--488--dfs||hdu-1016-Prime Ring Problem
/* Name: NYOJ--488--素数环 Author: shen_渊 Date: 15/04/17 15:30 Description: DFS,素数打个表,37以内就够用了 */ #include<cstring> #include<iostream> #include<cstdio> #include<algorithm> using namespace std; void dfs(int); int n; //int prime[25] = {2,3,5,7,11,13,17,19,23,29,31,37};学到下面一招 bool prime[45]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0}; int arr[22]; int vis[22]; int main() { // freopen("in.txt","r",stdin); int m = 0; while(cin>>n,n){ memset(arr,0,sizeof(arr)); memset(vis,0,sizeof(vis)); arr[1] = 1; cout<<"Case "<<++m<<":\n"; if(n == 1)cout<<"1\n"; else if(n%2){ cout<<"No Answer\n"; }else{ dfs(2); } } return 0; } void dfs(int ct){ if(ct == n+1 && prime[arr[n]+arr[1]]){ for(int i=1; i<=n; ++i) cout<<arr[i]<<" "; cout<<endl; }else{ for(int i=2; i<=n; ++i){ if(!vis[i] && prime[arr[ct-1]+i]){ arr[ct] = i; vis[i] = 1; dfs(ct+1); vis[i] = 0; } } } }
因为用ios::sync_with_stdio(false);取消了C的stream和C++的stream的同步,所以输出出现了不符合预期的结果,以后还是少用cin,cout,scanf,printf,C和C++混合输出的方式
/* Name:hdu-1016-Prime Ring Problem Copyright: Author: Date: 2018/5/19 16:59:52 Description:水题 */ #include <cstring> #include <iostream> #include <cstdio> using namespace std; int n, arr[25], vis[25]; int prime[40]={0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0};//素数打表,因为n最大是20,所以只要打到40 bool jundge(int n) { for (int i=2; i*i<=n; i++) { if (n%i == 0) return 0; } return 1; } void dfs(int ct) { if (ct == n) { if (prime[arr[ct] + 1]) { cout<<arr[1]; for (int i=2; i<=n; i++) { cout<<" "<<arr[i]; } cout<<endl; } } else { for (int i=2; i<=n; i++) { if (vis[i] == 0 && prime[i+arr[ct]]) { arr[ct+1] = i; vis[i] = 1; dfs(ct+1); vis[i] = 0; } } } } int main() { // ios::sync_with_stdio(false); // 加上这一句,用printf输出WA,cout输出AC,测试后发现,用文件读取输入输出的时候, // printf并不能输出 Case 1:这一行的输出 int k = 0; while (cin>>n) { // printf("Case %d:\n", ++k); cout<<"Case "<<++k<<":\n"; if (n == 1) { cout<<"1\n\n"; continue; } if (n & 1) { cout<<endl; continue; } memset(arr, 0, sizeof(arr)); memset(vis, 0, sizeof(vis)); arr[1] = 1; dfs(1); cout<<endl; } return 0; }