const int stepRow[8] = {-1,-2,-2,-1,1,2,2,1}; const int stepLine[8] = {-2,-1,1,2,2,1,-1,-2}; int board[8][8]; // 求(i,j)的出口数,各个出口对应的号存在a[]中。 // s表示顺序选择法的开始 int exitn(int i,int j,int s,int *a) { int i1,j1,k,count; for (count=k=0;k<8;k++) { i1 = i + step8[(s + k)% 8]; j1 = j + step8[(s + k)% 8]; if (i1>=0 && i1<8 && j1>=0 && j1<8 && board[i1][j1]==0) a[count++] = (s + k)% 8; } return count; } // 判断选择下个出口,s 是顺序选择法的开始序号 int next(int i,int j,int s) { int m, kk, a[8], b[8], temp; if ((m=exitn(i,j,s,a))==0) return -1; // 没有出口 for (int min=9,k=0; k<m; k++) { // 逐个考虑取下一步最少的出口的出口 temp = exitn(i+step8[a[k]], j+step8[a[k]], s, b); if (temp<min) min = temp, kk = a[k]; } return kk; } int main() { int i,j,step,no,start=0; cin>>sx>>sy; do { memset(board,0,sizeof(board)); board[sx][sy] = 1; i = sx, j = sy; for (step=2; step<=64; step++) |