迭代深搜+A*(IDA*)
来源:互联网 发布:网络浪涌保护器 编辑:程序博客网 时间:2024/06/07 04:08
HDU 2234 无题I
题目意思中文的也就不用翻译了;
广搜由于要记录大量的状态因此耗费的空间比较大,深搜由于要遍历所有的状态,所以耗费的时间就比较高;
A*算法就相当于普通的搜索算法加了一个很厉害的剪枝,让结果尽量最优的先搜具体的请百度,这是一个神奇的东西,非常强大;
迭代深搜就是广搜加深搜,用深搜的空间和广搜的时间来解决问题;
每次固定深搜的层数,就相当于广搜到了第几层,用深搜遍历,找到结果则退出,找不到则加深搜索层数;
这一题就是通过判断每一行和每一列要达到解的最小步数来剪枝,如果 最小步数+当前层数 比要搜的最大深度还要深则肯定无解,然后在深度范围内深搜,无解加大深度,>5则无解;
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>using namespace std;int x[4][4],deep;int judge1(int n)//第n行最大相同的有几个{ int a[5]= {0,0,0,0,0}; a[x[n][0]]++,a[x[n][1]]++,a[x[n][2]]++,a[x[n][3]]++; return max(a[1],max(a[2],max(a[3],a[4])));}int judge2(int n)//第n列最大相同的有几个{ int a[5]= {0,0,0,0,0}; a[x[0][n]]++,a[x[1][n]]++,a[x[2][n]]++,a[x[3][n]]++; return max(a[1],max(a[2],max(a[3],a[4])));}int get_h()//得到解最少需要移动的步数{ int sum1=0,sum2=0; for(int i=0; i<4; i++) { sum1+=4-judge1(i); sum2+=4-judge2(i); } return (min(sum1,sum2)+3)/4;//移动异步会改变4种状态}int get_ans()//判断是否达到解的状态{ int flag1=1,flag2=1; for(int i=0;i<4;i++) { if(judge1(i)!=4) flag1=0; if(judge2(i)!=4) flag2=0; } return flag1|flag2;}int dfs(int dep,int f)//迭代深搜{ if((dep+get_h())>deep)//大于搜索层数返回false return 0; if(get_ans())//得到答案 return 1; int tmp[4][4]; for(int a=0; a<4; a++) for(int b=0; b<4; b++) tmp[a][b]=x[a][b];//记录初始状态 for(int i=0; i<16; i++) { if((f+i)!=15) { if(i<4)//向上移动 { int v=i%4; for(int i=2; i>=0; i--) swap(x[i][v],x[3][v]); } else if(i<8)//左 { int v=i%4; for(int i=2; i>=0; i--) swap(x[v][3],x[v][i]); } else if(i<12)//右 { int v=3-(i%4); for(int i=1; i<4; i++) swap(x[v][0],x[v][i]); } else if(i<16)//下 { int v=3-(i%4); for(int i=1; i<4; i++) swap(x[0][v],x[i][v]); } } if(dfs(dep+1,i))//继续深搜 return 1; else//还原 { for(int a=0; a<4; a++) for(int b=0; b<4; b++) x[a][b]=tmp[a][b]; } } return 0;}int main(){ int ncase; scanf("%d",&ncase); while(ncase--) { deep=1; for(int i=0; i<4; i++) for(int j=0; j<4; j++) scanf("%d",&x[i][j]); while(1) { if(dfs(0,-1))//找到解 break; deep++;//层次加深 if(deep>5)//大于5没有结果 { deep=-1; break; } } printf("%d\n",deep); }}
1 0
- 迭代深搜+A*(IDA*)
- A* IDA*
- UVa 11212 - Editing a Book(IDA*)
- 11212 - Editing a Book(IDA*算法)
- UVa 11212:Editing a Book(IDA*)
- UVA-11212 Editing a Book (IDA*)
- UVA-11212 Editing a Book (IDA*)
- UVA11212 Editing a Book (IDA*)
- poj1077(A*,IDA*)
- A*,IDA*,Dijkstra
- 搜索,A* IDA*
- A* \IDA* 分析总结
- A*和IDA*算法
- IDA*(迭代加深的A*算法) 八数码
- 【UVA】11212-Editing a Book(IDA*搜索减枝)
- POJ 1077 Eight(八数码A*+IDA*)
- 挑战程序竞赛系列(32):4.5 A*与IDA*
- (A*,IDA*,DFS)eight(p1077)
- 类:基础电子书
- Spring Boot系列教程十一: Mybatis使用分页插件PageHelper
- Android之---沉浸式状态栏的错误理解(官方有沉浸模式的感念但是没有沉浸式状态栏的说法)
- tomcat 7
- JVM内存管理之内存回收策略
- 迭代深搜+A*(IDA*)
- @import调用css和link href调用区别
- ORA-01102: cannot mount database in EXCLUSIVE mode
- 欢迎使用CSDN-markdown编辑器
- 上下界网络流学习总结
- Longest Common Prefix
- 我自己的视图业务数据库模式
- Fragment使用姿势之NoFragment
- zoj2208