题目描述 Description

在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上。

给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘:

为了体现出骑士精神,他们必须以最少的步数完成任务。

输入描述 Input Description

第一行有一个正整数T(T<=10),表示一共有N组数据。接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位。两组数据之间没有空行。

输出描述 Output Description

对于每组数据都输出一行。如果能在15步以内(包括15步)到达目标状态,则输出步数,否则输出-1。

样例输入 Sample Input
2
10110
01*11
10111
01001
00000
01011
110*1
01110
01010
00100
样例输出 Sample Output

7

-1

数据范围及提示 Data Size & Hint

见题面

/*
迭代加深搜索
加了两个剪枝,跑了47ms
①刚交换完的两个点不能立马交换回来
②如果当前有c个点与目标棋局不同,且已经走了t-1步,
如果c+t-2>limit ,则该方案不可行
*/
#include<cstdio>
#include<iostream>
#define M 6
using namespace std;
int goal[M][M]={{,,,,,},{,,,,,},{,,,,,},
{,,,,,},{,,,,,},{,,,,,}};
int aa[]={,,-,-,,,-,-};
int bb[]={,-,,-,,-,,-};
int a[M][M],map[M][M],num[M][M],ans;
int check()
{
int tot=;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(a[i][j]!=goal[i][j])
tot++;
return tot;
}
void fuzhi()
{
for(int i=;i<=;i++)
for(int j=;j<=;j++)
a[i][j]=map[i][j];
}
void dfs(int sx,int sy,int x,int y,int t,int limit)
{
int c=check();
if(!c)
{
ans=min(ans,t-);
return;
}
if(t+c->limit)return;//①
if(t>limit)return;
for(int i=;i<;i++)
{
int xx=x+aa[i];
int yy=y+bb[i];
if(xx>=&&xx<=&&yy>=&&yy<=&&!(xx==sx&&yy==sy))//②
{
swap(a[x][y],a[xx][yy]);
dfs(x,y,xx,yy,t+,limit);
swap(a[x][y],a[xx][yy]);
}
}
}
void init()
{
int qx,qy;
ans=;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
char c;
cin>>c;
if(c=='*')map[i][j]=,qx=i,qy=j;
else map[i][j]=c-'';
}
for(int k=;k<=;k++)
{
fuzhi();
dfs(qx,qy,qx,qy,,k);
if(ans<){printf("%d\n",ans);return;}
}
printf("-1\n");
}
int main()
{
int T;
scanf("%d",&T);
while(T--)init();
return ;
}

最新文章

  1. ASP.NET Core的配置(4):多样性的配置来源[中篇]
  2. 让python在hadoop上跑起来
  3. 微软良心之作——Visual Studio Code 开源免费跨平台代码编辑器
  4. PHP操作MongoDB数据库
  5. 【Qt】Qt之密码框不可选中、复制、粘贴、无右键菜单等【转】
  6. js函数——倒计时模块+无缝滚动
  7. OpenXml操作Word的一些操作总结.无word组件生成word.
  8. 辨别 ShopEX Ecshop
  9. Raphael的transform用法
  10. 跳跳棋(9018_1563)(BZOJ_2144)
  11. Beta No.2
  12. [JLOI 2015]装备购买
  13. ubuntu 16.04扩充root 分区
  14. 关于C#鼠标方面的。
  15. PHP异步扩展Swoole笔记(2)
  16. Rabbit and Grass
  17. 牛客网_Go语言相关练习_选择题(1)
  18. Django 权限管理(二)
  19. js方法传入对象;js方法传入方法;js方法回调 callback
  20. iOS 解决UIScrollView布局问题(布局受statusBar和NavigationBar影响)

热门文章

  1. AJPFX:实现递归统计文件夹的总大小
  2. 学JAVA第二十四天,Set集合与StringBuilder
  3. JS学习-事件响应小结-简单的计算器
  4. 使用 Azure ARM 部署Word Press 遇到 Extension节点 扩展的问题
  5. php中的define()函数
  6. java将一个List赋值给另一个List的4种方法
  7. Intel手册 Chapter23 VMX的简单介绍
  8. 手把手教你免费把网站IP换成1.1.1.1/1.0.0.1
  9. springBoot + KISSO实现单点登录
  10. uva1660 Cable TV Network