http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3861
这道题当时没做出来,后来经过队友提醒才做出来。
3*3的九宫格,给你其中n个点按下面要求连起来:
1. 给你的n个点都要激活(至少经过一次)
2. 如果点A,B相连后要经过另一个点C,则C在序列中的位置必须在A,B之前 如 1 7 4是不合法的
3.线段相交是没关系的,如 7 6 9 4
我是直接生成n个数的全排列,然后在所有排列里面去掉不合法的。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <vector> 5 #include <cstring> 6 #include <string> 7 #include <algorithm> 8 #include <string> 9 #include <set> 10 #include <functional> 11 #include <numeric> 12 #include <sstream> 13 #include <stack> 14 #include <map> 15 #include <queue> 16 17 #define CL(arr, val) memset(arr, val, sizeof(arr)) 18 19 #define ll long long 20 #define inf 0x7f7f7f7f 21 #define lc l,m,rt<<1 22 #define rc m + 1,r,rt<<1|1 23 #define pi acos(-1.0) 24 25 #define L(x) (x) << 1 26 #define R(x) (x) << 1 | 1 27 #define MID(l, r) (l + r) >> 1 28 #define Min(x, y) (x) < (y) ? (x) : (y) 29 #define Max(x, y) (x) < (y) ? (y) : (x) 30 #define E(x) (1 << (x)) 31 #define iabs(x) (x) < 0 ? -(x) : (x) 32 #define OUT(x) printf("%I64d ", x) 33 #define lowbit(x) (x)&(-x) 34 #define Read() freopen("data.txt", "r", stdin) 35 #define Write() freopen("a.txt", "w", stdout); 36 #define maxn 1000000000 37 #define N 500010 38 using namespace std; 39 40 int b[N][15]; 41 int n,ans,p[15],flag[15]; 42 43 bool check(int x) 44 { 45 memset(flag,0,sizeof(flag)); //标记访问或者没访问 46 for(int i=0;i<n;i++) 47 { 48 flag[b[x][i]]=1; 49 if((b[x][i]==1&&b[x][i+1]==9&&flag[5]==0)||(b[x][i]==9&&b[x][i+1]==1&&flag[5]==0) 50 ||(b[x][i]==1&&b[x][i+1]==7&&flag[4]==0)||(b[x][i]==7&&b[x][i+1]==1&&flag[4]==0) 51 ||(b[x][i]==1&&b[x][i+1]==3&&flag[2]==0)||(b[x][i]==3&&b[x][i+1]==1&&flag[2]==0) 52 ||(b[x][i]==2&&b[x][i+1]==8&&flag[5]==0)||(b[x][i]==8&&b[x][i+1]==2&&flag[5]==0) 53 ||(b[x][i]==3&&b[x][i+1]==9&&flag[6]==0)||(b[x][i]==9&&b[x][i+1]==3&&flag[6]==0) 54 ||(b[x][i]==3&&b[x][i+1]==7&&flag[5]==0)||(b[x][i]==7&&b[x][i+1]==3&&flag[5]==0) 55 ||(b[x][i]==4&&b[x][i+1]==6&&flag[5]==0)||(b[x][i]==6&&b[x][i+1]==4&&flag[5]==0) 56 ||(b[x][i]==7&&b[x][i+1]==9&&flag[8]==0)||(b[x][i]==9&&b[x][i+1]==7&&flag[8]==0)) 57 return 0; 58 } 59 return 1; 60 } 61 int main() 62 { 63 //Read(); 64 //Write(); 65 int t; 66 scanf("%d",&t); 67 while(t--) 68 { 69 scanf("%d",&n); 70 for(int i=0;i<n;i++) scanf("%d",&p[i]); 71 sort(p,p+n); 72 ans=0; 73 memset(b,0,sizeof(b)); 74 do 75 { 76 for(int i=0;i<n;i++) 77 b[ans][i]=p[i]; 78 ans++; 79 }while(next_permutation(p,p+n)); 80 int x=ans; 81 for(int i=0;i<ans;i++) 82 { 83 if(check(i)==0) 84 x--; 85 } 86 printf("%d ",x); 87 for(int i=0;i<ans;i++) 88 { 89 if(check(i)) 90 { 91 for(int j=0;j<n;j++) 92 { 93 if(j!=n-1) 94 printf("%d ",b[i][j]); 95 else 96 printf("%d ",b[i][j]); 97 } 98 } 99 100 } 101 } 102 return 0; 103 }
dfs也可以做!
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 int mp[10][10]; 9 int a[10]; 10 int n; 11 bool vis[10]; 12 int cnt; 13 int s[10]; 14 15 void init() 16 { 17 mp[1][3] = 2; mp[3][1] = 2; 18 mp[1][7] = 4; mp[7][1] = 4; 19 mp[1][9] = 5; mp[9][1] = 5; 20 mp[2][8] = 5; mp[8][2] = 5; 21 mp[3][7] = 5; mp[7][3] = 5; 22 mp[3][9] = 6; mp[9][3] = 6; 23 mp[4][6] = 5; mp[6][4] = 5; 24 mp[7][9] = 8; mp[9][7] = 8; 25 } 26 27 void dfs(int pre,int num,int op) 28 { 29 // printf("%d %d ",pre,num); 30 int i,t; 31 if(num==n) 32 { 33 if(op){ 34 for(i=0;i<n-1;i++)printf("%d ",s[i]); 35 printf("%d ",s[n-1]); 36 } 37 cnt++; 38 return; 39 } 40 41 for(i=0;i<n;i++) 42 { 43 if(!vis[a[i]]) 44 { 45 if(mp[pre][a[i]]==0||vis[mp[pre][a[i]]]==true) 46 { 47 vis[a[i]]=true; 48 s[num]=a[i]; 49 dfs(a[i],num+1,op); 50 vis[a[i]]=false; 51 } 52 } 53 } 54 } 55 int main() 56 { 57 //freopen("a.txt","r",stdin); 58 int T,i,j; 59 scanf("%d",&T); 60 init(); 61 while(T--) 62 { 63 scanf("%d",&n); 64 for(i=0;i<n;i++){ 65 scanf("%d",&a[i]); 66 } 67 sort(a,a+n); 68 cnt=0; 69 for(i=0;i<n;i++){ 70 memset(vis,false,sizeof(vis)); 71 vis[a[i]]=true; 72 s[0]=a[i]; 73 dfs(a[i],1,0); 74 } 75 printf("%d ",cnt); 76 for(i=0;i<n;i++){ 77 memset(vis,false,sizeof(vis)); 78 vis[a[i]]=true; 79 s[0]=a[i]; 80 dfs(a[i],1,1); 81 } 82 } 83 return 0; 84 }