用二进制数的每个位代表某行中每个位上是否能用。
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<vector> #include<queue> #include<math.h> using namespace std; int n,a[50],all,ans,o; void print() { if(ans<=3) { for(int i=1;i<=n;i++) { int cnt=0,c; c=a[i]; while(c) { cnt++; c=(c>>1); } printf("%d ",cnt); } cout<<endl; } return; } void bfs(int r,int ld,int rd) { if(r==all) {ans++;print();return;} int pos=all&~(r|ld|rd); while(pos!=0) { int p=pos&(~pos+1); pos-=p; o++; a[o]=p; bfs(r+p,(ld+p)<<1,(rd+p)>>1); o--; } } int main() { cin>>n; all=(1<<n)-1; bfs(0,0,0); cout<<ans; return 0; }