/*
B题
类型:动态规划,思考由后往前,代码,由前往后。。。注意边界。。。
*/
#include
#include
#include
#include
using namespace std;
#define manx 1009
string x;
int z[manx];
int main(){
int n;
while(cin>>n){
char s[109];
for(int i=0;i>s;
x += s[0];
}
for(int i=0;i=0;j--){
z[i]=max(z[i],z[j]);
if(x[i]==x[j] && j>=1) z[i]=max(z[i],z[j-1]+1);
if(x[i]==x[j] && j==0) z[i]=max(z[i],1);
}
}
cout<
/*
G题
类型:状态压缩搜索
思路,因为状态特殊,每一个状态都可以用一个数字来代替
*/
#include
#include
#include
#include
#include
using namespace std;
#define manx 600000
int flag,mark;
bool s[manx];
struct node{
int ans;
int temp;
};
queueque;
void init(){
while(!que.empty()) que.pop();
for(int i=0;i=0){
node qe=te;
swap(x[xx][yy],x[xx-1][yy]);
qe.temp++;
int sum=0;
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
sum=sum*10+x[i][j];
}
}
qe.ans=sum;
if(!s[sum]) { s[sum]=1; que.push(qe); }
swap(x[xx][yy],x[xx-1][yy]);
}
if(yy+1<3){
node qe=te;
swap(x[xx][yy],x[xx][yy+1]);
qe.temp++;
int sum=0;
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
sum=sum*10+x[i][j];
}
}
qe.ans=sum;
if(!s[sum]) { s[sum]=1; que.push(qe); }
swap(x[xx][yy],x[xx][yy+1]);
}
if(yy-1>=0){
node qe=te;
swap(x[xx][yy],x[xx][yy-1]);
qe.temp++;
int sum=0;
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
sum=sum*10+x[i][j];
}
}
qe.ans=sum;
if(!s[sum]) { s[sum]=1; que.push(qe); }
swap(x[xx][yy],x[xx][yy-1]);
}
}
}
int main(){
int t;
cin>>t;
while(t--){
init();
int a,sum=0;
flag=0;
node te;
int st,ed,val;
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
scanf("%d",&val);
if(val==0) st=i,ed=j;
sum=sum*10+val;
}
}
te.ans=sum;
sum=0;
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
scanf("%d",&a);
sum=sum*10+a;
}
}
mark=sum;
te.temp=0;
que.push(te);
bfs(st,ed);
if(!flag) cout<<"Impossible!"<