标签:
点击打开链接http://acm.fzu.edu.cn/problem.php?pid=2180
#include <stdio.h>
#include <string.h>
#include <memory.h>
typedef struct{
int x;
int y;
}Move;
Move move[8]={{1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}};
int flag,min;
char goal[6][6]={{"11111"},{"01111"},{"00*11"},{"00001"},{"00000"}},str[6][6];
int check()
{
int i,j,k;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(goal[i][j]!=str[i][j])
return 0;
}
}
return 1;
}
void exchange(int a,int b,int x,int y)
{
char c;
c=str[a][b];
str[a][b]=str[x][y];
str[x][y]=c;
}
void dfs(int cur,int x,int y,int dirx,int diry)
{
char c;
int i,j,k,a=x,b=y;
if(cur<=15&&cur<min) //走重复没关系 因为步数限制在10 不会死循环
{
if(check())
{
flag=1;
if(min>cur)
{
min=cur;
}
return;
}
for(i=0;i<8;i++)
{
if(move[i].x==-(dirx)&&move[i].y==-(diry)) continue; //走到下一层 八个方向中 有一个又走到上一层 可以cut
a=x+move[i].x;
b=y+move[i].y;
if(a>=0&&a<5&&b>=0&&b<5)
{
exchange(a,b,x,y); //
dfs(cur+1,a,b,move[i].x,move[i].y);
exchange(a,b,x,y); //回溯搜索
}
}
}
}
int main()
{
int f,t,i,j,k,n,a,b;
scanf("%d",&t);
while(t--)
{
min=999;
flag=0;
for(i=0;i<5;i++)
{
scanf("%s",str[i]);
for(j=0;j<5;j++)
{
if(str[i][j]=='*')
{
a=i;
b=j;
}
}
}
dfs(0,a,b,-1,-1);
if(flag)
printf("%d\n",min);
else
printf("Bored!\n");
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/jeremy1149/article/details/51346069