Code: Select all
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
char board[6][6];
int sr[5][5];
int goal[5][5]={
1,1,1,1,1,
0,1,1,1,1,
0,0,-1,1,1,
0,0,0,0,1,
0,0,0,0,0,
};
int min,sx,sy;
bool visit[5][5];
int check()
{
int i,j;
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(sr[i][j]!=goal[i][j]) return false;
}
}
return true;
}
void dfs(int srx,int sry,int cn)
{
if(srx<0||sry<0) return;
if(srx>4||sry>4) return;
if(cn>10) return;
if(check()){if(min>cn) min=cn;return;}
if(visit[srx+1][sry+2]==false){
int temp=sr[srx][sry]=sr[srx+1][sry+2];
sr[srx+1][sry+2]=-1;
visit[srx+1][sry+2]=true;
dfs(srx+1,sry+2,cn+1);
sr[srx+1][sry+2]=temp;
sr[srx][sry]=-1;
visit[srx+1][sry+2]=false;
}
if(visit[srx-1][sry+2]==false){
int temp=sr[srx][sry]=sr[srx-1][sry+2];
sr[srx-1][sry+2]=-1;
visit[srx-1][sry+2]=true;
dfs(srx-1,sry+2,cn+1);
sr[srx-1][sry+2]=temp;
visit[srx-1][sry+2]=false;
sr[srx][sry]=-1;
}
if(visit[srx+1][sry-2]==false){
int temp=sr[srx][sry]=sr[srx+1][sry-2];
sr[srx+1][sry-2]=-1;
visit[srx+1][sry-2]=true;
dfs(srx+1,sry-2,cn+1);
sr[srx+1][sry-2]=temp;
sr[srx][sry]=-1;
visit[srx+1][sry-2]=false;
}
if(visit[srx-1][sry-2]==false){
int temp=sr[srx][sry]=sr[srx-1][sry-2];
sr[srx-1][sry-2]=-1;
visit[srx-1][sry-2]=true;
dfs(srx-1,sry-2,cn+1);
sr[srx-1][sry-2]=temp;
sr[srx][sry]=-1;
visit[srx-1][sry-2]=false;
}
//
if(visit[srx+2][sry+1]==false){
int temp=sr[srx][sry]=sr[srx+2][sry+1];
sr[srx+2][sry+1]=-1;
visit[srx+2][sry+1]=true;
dfs(srx+2,sry+1,cn+1);
sr[srx+2][sry+1]=temp;
sr[srx][sry]=-1;
visit[srx+2][sry+1]=false;
}
if(visit[srx-2][sry+1]==false){
int temp=sr[srx][sry]=sr[srx-2][sry+1];
sr[srx-2][sry+1]=-1;
visit[srx-2][sry+1]=true;
dfs(srx-2,sry+1,cn+1);
sr[srx-2][sry+1]=temp;
sr[srx][sry]=-1;
visit[srx-2][sry+1]=false;
}
if(visit[srx+2][sry-1]==false){
int temp=sr[srx][sry]=sr[srx+2][sry-1];
sr[srx+2][sry-1]=-1;
visit[srx+2][sry-1]=true;
dfs(srx+2,sry-1,cn+1);
sr[srx+2][sry-1]=temp;
sr[srx][sry]=-1;
visit[srx+2][sry-1]=false;
}
if(visit[srx-2][sry-1]==false){
int temp=sr[srx][sry]=sr[srx-2][sry-1];
sr[srx-2][sry-1]=-1;
visit[srx-2][sry-1]=true;
dfs(srx-2,sry-1,cn+1);
sr[srx-2][sry-1]=temp;
sr[srx][sry]=-1;
visit[srx-2][sry-1]=false;
}
return;
}
int main()
{
int tst,i,j;
char ss[100];
gets(ss);
sscanf(ss,"%d",&tst);
while(tst--){
for(i=0;i<5;){
gets(board[i]);
if(board[i][0]=='\0') continue;
else i++;
}
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(board[i][j]=='1') sr[i][j]=1;
else if(board[i][j]=='0') sr[i][j]=0;
else if(board[i][j]==' '){sr[i][j]=-1;sx=i;sy=j;}
}
}
memset(visit,false,sizeof(visit));
min=1<<30;
dfs(sx,sy,0);
if(min>10) printf("Unsolvable in less than 11 move(s).\n");
else printf("Solvable in %d move(s).\n",min);
}
return 0;
}
help would be appreciated.