BZOJ 1085: [SCOI2005]骑士精神
2014-07-23 20:17
281 查看
Description
在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上。 给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务。Input
第一行有一个正整数T(T<=10),表示一共有N组数据。接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位。两组数据之间没有空行。Output
对于每组数据都输出一行。如果能在15步以内(包括15步)到达目标状态,则输出步数,否则输出-1。Sample Input
210110
01*11
10111
01001
00000
01011
110*1
01110
01010
00100
Sample Output
7-1
题解
A*算法(启发式搜索)。省队夏令营让我觉得我的搜索很弱……#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; int t,a[5][5],x,y,tag; int ans[5][5]={{1,1,1,1,1}, {0,1,1,1,1}, {0,0,2,1,1}, {0,0,0,0,1}, {0,0,0,0,0} }; int xx[8]={1,1,2,2,-1,-1,-2,-2},yy[8]={2,-2,1,-1,2,-2,1,-1}; void init() { int i,j; char ch[10]; for(i=0;i<5;i++) {scanf("%s",ch); for(j=0;j<5;j++) {if(ch[j]=='*') {a[i][j]=2; x=i; y=j;} else a[i][j]=ch[j]-'0'; } } } bool check(int a[5][5]) { int i,j; for(i=0;i<5;i++) for(j=0;j<5;j++) {if(ans[i][j]!=a[i][j]) return false;} return true; } bool eva(int s,int a[5][5],int b) { int ct=0,i,j; for(i=0;i<5;i++) for(j=0;j<5;j++) {if(ans[i][j]!=a[i][j]) {ct++; if(ct+s>b) return false; } } return true; } void search(int s,int a[5][5],int xn,int yn,int b) { if(s==b) {if(check(a)) {tag=1; return;}} if(tag) return; int i,xt,yt; for(i=0;i<=8;i++) {xt=xn+xx[i]; yt=yn+yy[i]; if(xt<0||xt>4||yt<0||yt>4) continue; swap(a[xn][yn],a[xt][yt]); if(eva(s,a,b)) search(s+1,a,xt,yt,b); swap(a[xn][yn],a[xt][yt]); } } int main() { scanf("%d",&t); while(t--) {int i; init(); tag=0; for(i=1;i<=15;i++) {search(0,a,x,y,i); if(tag) {printf("%d\n",i); break;} } if(!tag) printf("-1\n"); } return 0; }
相关文章推荐
- BZOJ大视野 1085: [SCOI2005]骑士精神
- bzoj 1085: [SCOI2005]骑士精神(IDA*)
- BZOJ1085: [SCOI2005]骑士精神
- BZOJ1085 [SCOI2005]骑士精神
- BZOJ 1085: [SCOI2005]骑士精神 启发式搜索+迭代加深
- [IDA*] BZOJ1085: [SCOI2005]骑士精神
- 【BZOJ】【1085】【SCOI2005】骑士精神
- [BZOJ1085][SCOI2005]骑士精神
- bzoj 1085: [SCOI2005]骑士精神
- [SCOI2005][BZOJ1085][迭代加深+A*剪枝]骑士精神
- bzoj 1085: [SCOI2005]骑士精神 IDA*
- [bzoj1085][SCOI2005]骑士精神【暴力】
- [SCOI2005]骑士精神
- 1085: [SCOI2005]骑士精神
- bzoj 1085: [SCOI2005]骑士精神
- 【BZOJ 1085】 [SCOI2005]骑士精神
- BZOJ 1085 SCOI 2005 骑士精神
- BZOJ 1085([SCOI2005]骑士精神-A*)
- [SCOI2005]骑士精神
- P2324 [SCOI2005]骑士精神