【搜索】骑士巡游问题,简称746弯
2013-11-20 08:53
369 查看
这个问题爆搜是不行的,因为你暴字打错了----某学长。
使用一个启发函数解决(哪个爆也不行),对每一个当前的可以走的边进行计算,统计以它为起点可以走的方法,然后走那条走法最少的边......
据说是先把难走的路走了,以后就好走了(人生赢家).......
反正这样就很快了,瞬间出解,但是初始方向的选择会影响出解(可能无解......)所以四个方向都要搞一下(出解了就停止)。
使用一个启发函数解决(哪个爆也不行),对每一个当前的可以走的边进行计算,统计以它为起点可以走的方法,然后走那条走法最少的边......
据说是先把难走的路走了,以后就好走了(人生赢家).......
反正这样就很快了,瞬间出解,但是初始方向的选择会影响出解(可能无解......)所以四个方向都要搞一下(出解了就停止)。
#include <iostream> #include <vector> using namespace std; const int COVER = -1; const int cond[8][2]={2,1,-2,-1,-2,1,2,-1,1,2,-1,-2,-1,2,1,-2}; static int map[10][10]={0}; struct node{ int x; int y; node(){x=y=0;} node(int a,int b){x=a;y=b;} }; vector<node> path; void init(){ memset(map,0,sizeof(map)); for(int i=0;i<=10;++i){ map[i][0] = COVER; map[0][i] = COVER; } } int judge(int x,int y){ int res = -1; int min = 65535; for(int i=0;i<8;++i){ int a = x+cond[i][0]; int b = y+cond[i][1]; int sum = 0; if(a>=1 && a<=8 && b>=1 && b<=8 && map[a][b] != COVER){ for(int p=0;p<8;++p){ int m = a+cond[p][0]; int n = b+cond[p][1]; if(m>=1 && m<=8 && n>=1 && n<=8 && map[m] == 0)sum++; } if(sum < min){ min = sum; res = i; } } } return res; } void find(int x,int y,int deep){ if(deep <= 0)return; map[x][y] = COVER; path.push_back(node(x,y)); int t = judge(x,y); find(x+cond[t][0],y+cond[t][1],deep-1); } int main(){ find(1,1,64); for(int i=0;i<path.size();++i) printf("(%2d,%2d)\t",path[i].x,path[i].y); return 0; }
相关文章推荐
- 骑士巡游问题的解法
- 骑士巡游问题
- HIHO #1308 : 搜索二·骑士问题
- hihoCoder搜索二---骑士问题---暴力法
- 骑士巡游问题
- 【hihocoder 1308】搜索二·骑士问题
- 骑士巡游问题源码C语言描述
- 用java解决骑士巡游问题
- 搜索二·骑士问题
- 骑士巡游问题的C++代码
- 骑士巡游问题算法
- hiho一下 第九十九周 #1308 : 搜索二·骑士问题 【宽度优先搜索】
- 骑士巡游问题的warnsdorff规则
- 骑士巡游问题
- 8600 骑士问题(回溯,搜索)
- 骑士巡游问题:常规解法与启发式方法优化
- 骑士巡游问题 python
- hihoCoder搜索二·骑士问题
- noi-openjudge[4.7搜索]怀表问题
- 埃及分数问题(迭代加深搜索)