博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1085: [SCOI2005]骑士精神
阅读量:4308 次
发布时间:2019-06-06

本文共 2023 字,大约阅读时间需要 6 分钟。

【传送门:


简要题意:

  有一个5*5的棋盘,棋盘上有12个白棋子,12个黑棋子,和一个空格,每只棋子只能按照马走日的规则移动,求出最少步数达到以下状态


题解:

  DFS+A*

  DFS很容易做,不过时间复杂度太高

  所以用A*来优化时间

  A*的好处预判当前递归到结束得到的值,从而判断是否进入递归,部分判断,避免遍历太多无用点


参考代码:

#include
#include
#include
#include
using namespace std;int a[6][6];const int dx[9]={
0,1,1,-1,-1,2,2,-2,-2};const int dy[9]={
0,2,-2,2,-2,1,-1,1,-1};bool bk;int ans[6][6]={ {
0,0,0,0,0,0}, {
0,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}};bool pd(){ for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) if(a[i][j]!=ans[i][j]) return false; return true;}int w;bool pdA(int k){ int s=0; for(int i=1;i<=5;i++) { for(int j=1;j<=5;j++) { if(a[i][j]!=ans[i][j]) { s++; if(s+k>w) return false; } } } return true;}void dfs(int x,int y,int k){ if(bk==true) return ; if(k==w) { if(pd()==true) bk=true; return ; } else { for(int i=1;i<=8;i++) { int tx=x+dx[i],ty=y+dy[i]; if(tx<1||tx>5||ty<1||ty>5) continue; swap(a[x][y],a[tx][ty]); if(pdA(k)==true) dfs(tx,ty,k+1); swap(a[x][y],a[tx][ty]); } }}int main(){ int T;scanf("%d",&T); while(T--) { char st[10]; int kx,ky; for(int i=1;i<=5;i++) { scanf("%s",st+1); for(int j=1;j<=5;j++) { if(st[j]=='*') { a[i][j]=2; kx=i,ky=j; } else a[i][j]=st[j]-'0'; } } bk=false; for(w=1;w<=15;w++) { dfs(kx,ky,0); if(bk==true) { printf("%d\n",w); break; } } if(bk==false) printf("-1\n"); } return 0;}

 

转载于:https://www.cnblogs.com/Never-mind/p/8608399.html

你可能感兴趣的文章
Hbase时间同步
查看>>
HBase1.0.0 实现数据增删查
查看>>
webpack4 入门配置研究
查看>>
if...else..的错误用法
查看>>
cURL模拟POST方式提交数据
查看>>
headroom.js插件使用方法
查看>>
Java 可变参数
查看>>
关闭和定时显示DIV
查看>>
screen
查看>>
iOS 动画基础总结篇
查看>>
Android ContentProvider
查看>>
史上最全最强SpringMVC详细示例实战教程
查看>>
class里面只能写以下5种
查看>>
《Vim实用技巧》阅读笔记 --- 移动及跳转
查看>>
C# 全角符号转半角
查看>>
python-2:工欲善其事,必先利其器 修改jupyter保存文件目录(亲测)
查看>>
Python 环境搭建
查看>>
免费字典api ,查询汉字完整信息
查看>>
Flume协作框架
查看>>
基于数据库的事务消息解决分布式事务方案
查看>>