代码略丑。。已经懒得去改了,华丽丽的563ms。。。
bfs暴搜,记录一下状态就行了。
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#define SZ(x) ((int)(x).size())
#define FOR(it,c) for ( __typeof((c).begin()) it=(c).begin(); it!=(c).end(); it++ )
using namespace std;
const int maxN=100010;
char s[10][10]={"ABDE","ABC","BCEF","ADG","BDEFH","CFI","DEGH","GHI","EFHI"};
int cnt[]={4,3,4,3,5,3,4,3,4},c[10][10],b[10][10],pre[1<<20],end,ans[1<<20],val[1<<20];
bool vis[1<<20];
struct Node{
int a[3][3],sum;
};
void bfs(){
queue<Node> q;
Node no;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
no.a[i][j]=c[i][j];
no.sum=end;
q.push(no);
while(!q.empty()){
Node no=q.front();q.pop();
//cout<<no.sum<<endl;
for(int i=1;i<=9;i++){
Node nn=no;
int k=1,sum=0;
for(int j=0;j<9;j++){
int nx=j/3,ny=j%3;
if(b[i][j])
nn.a[nx][ny]++,nn.a[nx][ny]%=4;
sum+=k*nn.a[nx][ny];
k*=4;
}
if(vis[sum]) continue;
vis[sum]=true;
pre[sum]=no.sum;
nn.sum=sum;
val[sum]=i;
if(sum==0) return;
q.push(nn);
}
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
for(int i=0;i<9;i++)
for(int j=0;j<cnt[i];j++)
b[i+1][s[i][j]-'A']=true;
int k=1;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++){
cin>>c[i][j];
end+=k*c[i][j];
k*=4;
}
bfs();
int top=0;
for(int i=0;i!=end;i=pre[i])
ans[top++]=val[i];
for(int i=top-1;i>=0;i--)
cout<<ans[i]<<(i?' ':'\n');
return 0;
}