*骑士周游,编号优先法*/
#include<stdio.h>
#include<time.h>
int a[8][8];
int temp;
int currentrow,currentcol;
int horizontal[8]={2,1,-1,-2,-2,-1,1,2};
int vertical[8]={-1,-2,-2,-1,1,2,2,1};
int b[8][8]={ {2,3,4,4,4,4,3,2},
{3,4,6,6,6,6,6,3},
{4,6,8,8,8,8,6,4},
{4,6,8,8,8,8,6,4},
{4,6,8,8,8,8,6,4},
{3,4,6,6,6,6,4,3},
{2,3,4,4,4,4,3,2} };
int ISOK(int n); //判断是否64步成功走完
int possible(); //试探走步
int output();
int possible_sort(); //找出最高优先的一种方法
void main()
{
int i,j,isok=0,rand_num1,rand_num2;
srand((unsigned)time(NULL));
j=1;
rand_num1=1; /*起始行*/
rand_num2=3; /*起始列*/
while(isok==0)
{
i=possible();
if(i<=7)
{
j++;
a[currentrow][currentcol]=j;
}
if(i>7) //不成功。及初始化
{
isok=ISOK(j);
if(isok==0)
{
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{ a[i][j]=0;}
}
currentrow=rand_num1;
currentcol=rand_num2;
j=1;
a[currentrow][currentcol]=j;
}
}
}
output();
}
int possible(void)
{
int possible_num,i,j,n;
possible_num=0;
while(possible_num<=7)
{
possible_num=rand()%8;
i=currentrow;
j=currentcol;
i+=vertical[possible_num];
j+=horizontal[possible_num];
n=possible_sort();
if(n>7)
{ return n;}
if(b[i][j]>temp) //判断随机值是否有最高优先级
{ possible_num=n; }
if(i>=0&&i<=7&&j>=0&&j<=7&&a[i][j]==0)
{
i=currentrow;
j=currentcol;
i+=vertical[possible_num];
j+=horizontal[possible_num];
currentrow=i;currentcol=j;
return possible_num;
}
}
}
int ISOK(int n)
{
int i;
if(n==64)
{ i=1;return i;}
else return i=0;
}
int output(void)
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
printf("%3d",a[i][j]);
}
printf("\n");
}
}
int possible_sort()
{
int i,j,possible_num,possible_min,END;
temp=8;
for(possible_num=0,END=0;possible_num<=7;possible_num++)
{
i=currentrow;
j=currentcol;
i+=vertical[possible_num];
j+=horizontal[possible_num];
if(i>=0&&i<=7&&j>=0&&j<=7&&a[i][j]==0)
{
if(b[i][j]<=temp)
{ temp=b[i][j];
possible_min=possible_num;
}
}
else END++;
}
if(END>7)
{ return END;}
return possible_min;
}