题目
挑战:将数字1-13分别放入三个桶中,满足任何桶中任意两个数的差与这两个数不在同一个桶中。
(例如,如果将数字5和7放入一个桶中,那么不能将数字2放入同一个桶中)
下方是解决方案:(文字颜色为白色,选中下一行即可查看)
[[2, 3, 7, 11, 12], [5, 6, 8, 9], [1, 4, 10, 13]]
或 [[2, 3, 11, 12], [5, 6, 7, 8, 9], [1, 4, 10, 13]]
同学很早以前问的一个题,做了之后就忘了告诉人家。近几天突然想起来,就扒了出来。
用回溯法做的
结果中有很多重复的,所以每种组合只输出一次
/* 挑战:将数字1-13分别放入三个桶中,满足任何桶中任意两个数的差与这两个数不在同一个桶中。 (例如,如果将数字5和7放入一个桶中,那么不能将数字2放入同一个桶中) 下方是解决方案:(文字颜色为白色,选中下一行即可查看) [[2, 3, 7, 11, 12], [5, 6, 8, 9], [1, 4, 10, 13]] 或 [[2, 3, 11, 12], [5, 6, 7, 8, 9], [1, 4, 10, 13]] */ #include <iostream> #include <cstring> using namespace std; int a[13]={1,2,3,4,5,6,7,8,9,10,11,12,13}; int a1[13],a2[13],a3[13]; int n1,n2,n3,count; bool IsCorrect(const int *ax,const int c,const int num) { int i,j,sub; if(-1==c) return true; for(i=0;i<=c;i++) { sub=num-ax[i]; for(j=0;j<=c;j++) if(ax[j]==sub) return false; } return true; } void Fill(int n) { if(14==n&&1==a1[0]&&2==a2[0]) { /*++count; cout<<"Case "<<count<<":"<<endl;*/ int tn1,tn2,tn3; tn1=tn2=tn3=0; ++count; cout<<"Case "<<count<<":"<<endl; //输出 a1,a2,a3 while(tn1<=n1) { cout<<a1[tn1++]<<" "; } cout<<endl; while(tn2<=n2) { cout<<a2[tn2++]<<" "; } cout<<endl; while(tn3<=n3) { cout<<a3[tn3++]<<" "; } cout<<endl; return; } if(IsCorrect(a1,n1,n)) { // cout<<n<<" a1"<<endl; a1[++n1]=n; Fill(n+1); a1[n1]=0; n1--; } if(IsCorrect(a2,n2,n)) { // cout<<n<<" a2"<<endl; a2[++n2]=n; Fill(n+1); a2[n2]=0; n2--; } if(IsCorrect(a3,n3,n)) { // cout<<n<<" a3"<<endl; a3[++n3]=n; Fill(n+1); a3[n3]=0; n3--; } return; } int main() { memset(a1,0,sizeof(a1)); memset(a2,0,sizeof(a2)); memset(a3,0,sizeof(a3)); n1=n2=n3=-1; count=0; Fill(1); return 0; }
时间: 2024-11-10 06:53:42