您的位置:首页 > 其它

【搜索】骑士巡游问题,简称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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: