1 条题解
-
0
C :
#include<stdio.h> int main() { printf("9 6 5 2 16 "); return 0; }
C++ :
#include <iostream> #include <cstring> using namespace std; #define N 19 #define M 5 bool vis[N+1]; int a[16]; bool valid(int t)//判断计算出来的数t是否合法 { if(t>19||t<1) return false; if(vis[t]) return false;//已使用,则不合法。 vis[t] =true;//合法,则标记其被使用了 return true;//合法 } void perms(int p[],int start) //从数组p中索引号为start的元素开始进行全排列 { int i,t; if(start==M) { for(i=0;i<5;i++) { a[i] = p[i]; vis[p[i]] = true; } t = 38-15-a[0]; if (valid(t)) a[6] = t; else return; t = 38-10-a[1]; if (valid(t)) a[10] = t; else return; t = 38-a[6]-a[2]; if (valid(t)) a[11] = t; else return; t = 38-a[2]-a[3]; if (valid(t)) a[15] = t; else return; t = 38-a[3]-a[10]; if (valid(t)) a[14] = t; else return; t = 38-13-a[4]-a[11]; if (valid(t)) a[7] = t; else return; t = 38-a[0]-a[1]-a[4]; if (valid(t)) a[5] = t; else return; t = 38-a[0]-a[7]-a[15]; if (valid(t)) a[12] = t; else return; t = 38-13-a[5]-a[14]; if (valid(t)) a[9] = t; else return; t = 38-a[11]-a[12]-a[14]; if (valid(t)) a[13] = t; else return; t = 38-a[6]-a[7]-a[9]-a[10]; if (valid(t)) a[8] = t; else return; //if(15+a[4]+a[8]+a[13]+a[3]!=38) return;//这三行可不判断 //if(10+a[5]+a[8]+a[12]+a[2]!=38) return; //if(a[1]+a[9]+a[13]+a[15]!=38) return; for(i=6;i<=10;i++) cout<<a[i]<<" "; return; } for(i=start;i<N;i++) { swap(p[i],p[start]); perms(p,start+1); memset(vis,false,sizeof(vis));// vis[10] = vis[13] = vis[15]=true;// swap(p[start],p[i]); } } int main() { int p[N]; for(int i=0;i<N;i++) p[i]=i+1; vis[10] = vis[13] = vis[15]=true; perms(p,0); return 0; }
- 1
信息
- ID
- 865
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者