和1152一样的题目,只是棋盘扩展为8*8的,需要做一下剪枝。其实也只是先走扩展数目少的位置,所以只需要在深搜的时候统计一下各个可达位置的扩展数目,再做一下排序,保证优先考虑走扩展数目少的位置。
#include <iostream>
using namespace std;
int arr[64];
struct dir {
int x;
int y;
int ctr;
};
struct dir p[8];
bool tab[8][8];
int flag = 0;
/*
bool leagel( int x, int y ) {
if ( x<0||x>7||y<0||y>7 )
return false;
else
return true;
}*/
int cal( int x, int y ) {
int ctr = 0;
for ( int i=0;i<8;i++ ) {
if ( x+p[i].x>=0&&x+p[i].x<8&&y+p[i].y>=0&&y+p[i].y<8 )
ctr++;
}
return ctr;
}
void sort() {
for ( int i=0;i<8;i++ ) {
for ( int j=0;j<8;j++ ) {
if ( p[i].ctr<p[j].ctr )
swap(p[i],p[j]);
}
}
}
void solve( int k, int x, int y ) {
int x1,y1,j;
if ( flag == 1 )
return;
if ( k==64 ) {
flag=1;
for ( int i = 0; i < 63; i++ )
cout << arr[i] << " ";
cout << arr[63] << endl;
}
else {
for ( j=0;j<8;j++ ) {
p[j].ctr=cal( x+p[j].x,y+p[j].y );
}
sort();
for ( j=0;j<8;j++ ) {
x1=x+p[j].x;
y1=y+p[j].y;
if ( x1>=0 && x1<8 && y1>=0 && y1<8 && tab[x1][y1]==true ) {
arr[k]=8*x1+y1+1;
tab[x1][y1]=false;
k++;
solve( k,x1,y1 );
tab[x1][y1]=true;
k--;
}
}
}
}
int main()
{
p[0].x=1;
p[0].y=-2;
p[1].x=2;
p[1].y=-1;
p[2].x=2;
p[2].y=1;
p[3].x=1;
p[3].y=2;
p[4].x=-1;
p[4].y=2;
p[5].x=-2;
p[5].y=1;
p[6].x=-2;
p[6].y=-1;
p[7].x=-1;
p[7].y=-2;
int n,i,k;
int x,y;
cin >> n;
while ( n!=-1 ) {
x=(n-1)/8;
y=(n-1)%8;
for ( i=0;i<8;i++ ) {
for ( k=0;k<8;k++ ) {
tab[i][k]=true;
}
}
flag = 0;
arr[0]=n;
tab[x][y]=false;
k=1;
solve( k,x,y );
cin >> n;
}
// system("pause");
return 0;
}