漂亮小姐姐单击就送:https://www.luogu.org/problemnew/show/P2324
题目描述
输入输出格式
输入格式:
第一行有一个正整数T(T<=10),表示一共有N组数据。接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位。两组数据之间没有空行。
输出格式:
对于每组数据都输出一行。如果能在15步以内(包括15步)到达目标状态,则输出步数,否则输出-1。
输入输出样例
说明
// luogu-judger-enable-o2 //先抄一遍吧 //实在是看不懂 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int N=20; int T; int map[N][N],x,y,maxdep,flag; int cx[8]={-2,-2,-1,-1,1,1,2,2}; int cy[8]={-1,1,-2,2,-2,2,-1,1}; int goal[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, }; inline bool check() { for(int i=1;i<5;++i) for(int j=0;j<5;++j) if(map[i][j]!=goal[i][j]) return false; return true; } inline int count() { int cnt=0; for(int i=0;i<5;++i) for(int j=0;j<5;++j) if(map[i][j]!=goal[i][j]) ++cnt; return cnt; } void dfs(int x,int y,int dep) { if(dep==maxdep) { if(check()) { flag=1; return; } } for(int i=0;i<8;++i) { int xx=x+cx[i],yy=y+cy[i]; if(xx>=0&&xx<5&&yy>=0&&yy<5) { swap(map[xx][yy],map[x][y]); int tmp=count(); if(dep+tmp<=maxdep) dfs(xx,yy,dep+1); swap(map[xx][yy],map[x][y]); if(flag) return; } } } char s[10]; int main() { scanf("%d",&T); while(T--) { flag=0; for(int i=0;i<5;++i) { scanf("%s",s); for(int j=0;j<5;++j) { if(s[j]=='0') map[i][j]=0; else if(s[j]=='1') map[i][j]=1; else map[i][j]=2, x=i,y=j; } } if(check()) { puts("0"); continue; } for(maxdep=1;maxdep<=15;++maxdep) { dfs(x,y,0); if(flag) break; } if(flag) printf("%d ",maxdep); else puts("-1"); } return 0; }