点击打开链接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; }
时间: 2024-12-06 01:58:32