[SCOI2005]骑士精神
Posted _yjk的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[SCOI2005]骑士精神相关的知识,希望对你有一定的参考价值。
骑士精神
#include<iostream> #include<cstdio> using namespace std; int t,MAXD,sx,sy; int a[6][6]; int dx[9]={0,-1,-2,1,-2,2,-1,2,1}; int dy[9]={0,-2,-1,-2,1,-1,2,1,2}; inline void read() { char c; for(int i=1;i<=5;i++) { while((c<‘0‘||c>‘9‘)&&c!=‘*‘) c=getchar(); for(int j=1;j<=5;j++) { if(c==‘*‘) { sx=i;sy=j; a[i][j]=2; c=getchar(); continue; } a[i][j]=c-‘0‘; c=getchar(); } } } int aim[6][6]={{0,0,0,0,0,0},{1,1,1,1,1,1},{0,0,1,1,1,1},{0,0,0,2,1,1},{0,0,0,0,0,1},{0,0,0,0,0,0}}; inline int close() //估价函数 { int Ans=0; for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) Ans+=aim[i][j]^a[i][j]; return Ans>>1; } inline bool dfs(int t,int x,int y,int pre) { if(t>15) return 0; int f=close(); if(f==0) { printf("%d\n",t); return 1; } if(t+f>MAXD) return 0; for(int i=1;i<=8;i++) if(i+pre!=9) { int xx=x+dx[i],yy=y+dy[i]; if(1<=xx&&xx<=5&&1<=yy&&yy<=5) { a[x][y]=a[xx][yy]; a[xx][yy]=2; if(dfs(t+1,xx,yy,i)) return 1; a[xx][yy]=a[x][y]; a[x][y]=2; } } return 0; } int main() { scanf("%d",&t); while(t--) { read(); bool f=0; for(MAXD=1;MAXD<=16;MAXD++) //迭代加深 if(dfs(0,sx,sy,0)){ f=1; break; } if(!f) puts("-1"); } return 0; }
以上是关于[SCOI2005]骑士精神的主要内容,如果未能解决你的问题,请参考以下文章