直接进行搜索即可,注意细节。 有更简便的写法但怕出错所以写得很长。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
struct node
{
int a[6];
}he[7];
bool flag;
int ans[10];
int tun[10];
bool vis[10];
void dfs(int pos)
{
if(flag)return ;
//cout<<pos<<endl;
if(pos==7)
{
flag=1;
return ;
}
if(pos==1)
{
for(int i=0;i<7;i++)
{
if(flag)return ;if(vis[i]) continue;
//cout<<"kk"<<endl;
for(int j=0;j<6;j++)
{
//cout<<he[i].a[j]<<endl;
if(he[i].a[j]==1)
{
tun[i]=(j-3+6)%6;
vis[i]=1;
ans[pos]=i;
dfs(pos+1);
vis[i]=0;
break;
}
}
}
}
if(pos==2)
{
for(int i=0;i<7;i++)
{
if(flag)return ;if(vis[i]) continue;
for(int j=0;j<6;j++)
{
if(he[i].a[j]==he[ans[0]].a[(tun[ans[0]]+1)%6]&&he[i].a[(j+1)%6]==he[ans[1]].a[(tun[ans[1]]+2)%6])
{
tun[i]=(j-4+6)%6;
ans[pos]=i;
vis[i]=1;
dfs(pos+1);
vis[i]=0; break;
}
}
}
}
if(pos==3)
{
for(int i=0;i<7;i++)
{
if(flag)return ;if(vis[i]) continue;
for(int j=0;j<6;j++)
{
if(he[i].a[j]==he[ans[0]].a[(tun[ans[0]]+2)%6]&&he[i].a[(j+1)%6]==he[ans[2]].a[(tun[ans[2]]+3)%6])
{
tun[i]=(j-5+6)%6;
ans[pos]=i;
vis[i]=1;
dfs(pos+1);
vis[i]=0;break;
}
}
}
}
if(pos==4)
{
for(int i=0;i<7;i++)
{
if(flag)return ;if(vis[i]) continue;
for(int j=0;j<6;j++)
{
if(he[i].a[j]==he[ans[0]].a[(tun[ans[0]]+3)%6]&&he[i].a[(j+1)%6]==he[ans[3]].a[(tun[ans[3]]+4)%6])
{
tun[i]=(j-6+6)%6;
ans[pos]=i;
vis[i]=1;
dfs(pos+1);
vis[i]=0;break;
}
}
}
}
if(pos==5)
{
for(int i=0;i<7;i++)
{
if(flag)return ;if(vis[i]) continue;
for(int j=0;j<6;j++)
{
if(he[i].a[j]==he[ans[0]].a[(tun[ans[0]]+4)%6]&&he[i].a[(j+1)%6]==he[ans[4]].a[(tun[ans[4]]+5)%6])
{
tun[i]=(j-1+6)%6;
ans[pos]=i;
vis[i]=1;
dfs(pos+1);
vis[i]=0; break;
}
}
}
}
if(pos==6)
{
for(int i=0;i<7;i++)
{
if(flag)return ;if(vis[i]) continue;
for(int j=0;j<6;j++)
{
if(he[i].a[(j-1+6)%6]==he[ans[1]].a[(tun[ans[1]]+4)%6]&&he[i].a[j]==he[ans[0]].a[(tun[ans[0]]+5)%6]&&he[i].a[(j+1)%6]==he[ans[5]].a[(tun[ans[5]]+6)%6])
{
tun[i]=(j-2+6)%6;
ans[pos]=i;
vis[i]=1;
dfs(pos+1);
vis[i]=0; break;
}
}
}
}
}
int main()
{
int n;
int t;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++)
{
flag=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<7;i++)
{
for(int j=0;j<6;j++)
{
scanf("%d",&he[i].a[j]);
}
}
///qidian
for(int i=0;i<7;i++)
{
if(flag) break;
for(int j=0;j<6;j++)
{
if(he[i].a[j]==1)
{
tun[i]=j;
vis[i]=1;
ans[0]=i;
dfs(1);
vis[i]=0;
break;
}
}
}
printf("Case %d:",cas);
if(flag==0)puts(" No solution");
else
{
for(int i=0;i<7;i++)
{
printf(" %d",ans[i]);
}
puts("");
}
}
}