【BZOJ1085】【SCOI2005】骑士精神(A*暴搜)
2016-03-09 20:04
369 查看
题目描述
传送门题解
启发式搜索,估价函数可以设为当前状态和目标状态有多少个不同。刚开始觉得比较奇怪,因为这里其实是按步数搜索。我的理解是应该是每一次搜索用估价函数计算出下一步哪一个得到正确结果的可能性最大,优先搜索可能性最大的。但是这道题貌似不适用。
可能是因为现在对A*的理解还不是很透彻,还需要慢慢消化。
明白之后补上。
代码
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int end[6][6]={{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}}; int sx[8]={1,1,-1,-1,2,2,-2,-2}; int sy[8]={2,-2,2,-2,1,-1,1,-1}; int T,now[6][6],x,y,k; bool flag; char ch; inline bool judge(){ for (int i=1;i<=5;++i) for (int j=1;j<=5;++j) if (end[i][j]!=now[i][j]) return false; return true; } inline bool eva(int step){ int tot=0; for (int i=1;i<=5;++i) for (int j=1;j<=5;++j) if (now[i][j]!=end[i][j]){ tot++; if (step+tot>k) return false; } return true; } inline void dfs(int step,int x,int y){ if (step==k&&judge()){ flag=true; return; } if (flag) return; for (int i=0;i<8;++i){ int nowx=x+sx[i],nowy=y+sy[i]; if (nowx>0&&nowx<=5&&nowy>0&&nowy<=5){ swap(now[x][y],now[nowx][nowy]); if (eva(step)) dfs(step+1,nowx,nowy); swap(now[x][y],now[nowx][nowy]); } } } int main(){ scanf("%d",&T); while (T--){ for (int i=1;i<=5;++i) for (int j=1;j<=5;++j){ ch=getchar(); while (ch!='1'&&ch!='0'&&ch!='*') ch=getchar(); if (ch=='*'){ x=i; y=j; now[i][j]=2; } else now[i][j]=ch-'0'; } for (k=1;k<=15;++k){ flag=false; dfs(0,x,y); if (flag){ printf("%d\n",k); break; } } if (!flag) printf("-1\n"); else flag=false; } }
总结
①字符串读入的时候注意一下。相关文章推荐
- fiddler对浏览器、app抓包及证书安装
- 不让苹果开发者账号折磨我
- 快速排序源码
- 嵌入式linux:3520a SDL_tff库做bmp 也就是osd
- mysql查询语句举例
- 第一次C++作业
- http与websocket两种协议下的跨域基于ASP.NET MVC--竹子整理
- hdu 5636
- 基于EasyDarwin EasyPusher实现Android手机直播推送功能
- 排序001-冒泡排序
- 基于EasyDarwin EasyPusher实现Android手机直播推送功能
- 变态的静态资源缓存与更新
- ORACLE之常用函数
- HDU-1027(Ignatius and the Princess II)(全排列dfs())
- cut命令
- TDM-GCC编译win32程序
- influxdata监控系统简介
- Codeforces #345 div1 D. Zip-line LIS dp
- Servlet 07 Cookie
- Learning Python(14)--struct模块