代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn=0x7fffffff;
int move[10][10]={
{0,0,0,0,0,0,0,0,0,0},
{0,1,1,0,1,1,0,0,0,0},
{0,1,1,1,0,0,0,0,0,0},
{0,0,1,1,0,1,1,0,0,0},
{0,1,0,0,1,0,0,1,0,0},
{0,0,1,0,1,1,1,0,1,0},
{0,0,0,1,0,0,1,0,0,1},
{0,0,0,0,1,1,0,1,1,0},
{0,0,0,0,0,0,0,1,1,1},
{0,0,0,0,0,1,1,0,1,1},
};//九种操作的改变状态(第一行和第一列忽略
int gre=27//最优操作次数;
int a[10];
int f[28],ope[28]//存放最优操作序列的数组,used[10]//这个操作进行过几次(同一种操作不能多于3次);
void search(int x,int p){
int po=0;
for(int i=1;i<=9;i++){
po+=a[i];
}
if(po==0){
for(int i=1;i<=27;i++){
ope[i]=f[i];
}
gre=p;
return;
}//边界判断:是否均为12点(即a[i]均为0)
for(int i=1;i<=9;i++){
cout<<i;
if(gre>p+1&&used[i]<3){
//cout<<p<<" "<<i<<" ";
int pre[10];
f[p+1]=i;
for(int j=1;j<=9;j++){
pre[j]=a[j];
a[j]=(a[j]+move[i][j])%4;
}
used[i]++;
search(i,p+1);
for(int j=1;j<=9;j++){
a[j]=pre[j];
}
used[i]--;
}
}
}//dfs
int main(){
for(int i=1;i<=9;i++){
scanf("%d",&a[i]);
a[i]=a[i]%4;
}
search(0,0);
//for(int i=1;i<=9;i++)cout<<a[i]<<" ";
for(int i=1;i<=gre;i++){
cout<<ope[i];
}
return 0;
}