这个也是回溯算法的经典案例。跟八皇后一起加深对回溯的理解。
骑士巡游问题构造解的思路相比八皇后要简单些:
int knight[N][N]={0}; //这里用0表示该位置未走过,走过的话该位置置1;为了打印出路径,将走过的位置依次值+1; static int dir_col[8]={-2,-1,1,2,2,1,-1,-2}; static int dir_row[8]={-1,-2,-2,-1,1,2,2,1};
int step=0; //这里用两个数组来定义骑士的下一步走向对应的8个方位的行列变化;
打印函数就不写了:
void show(){ ....//略 }
依然是判断位置有效性的函数:
bool possible(int row, int col){ if(!knight[row][col] && row>=0 && row <=7 && col>=0 && col<=7) //该位置未走过,且在棋盘范围内 return true; else return false; }
然后是回溯:
void seek(int row, int col){ if(N*N==step){ show(); return ; } for(int index=0; index<8; ++index){ if(possible(row+dir_row[index],col+dir_col[index])){ row+=dir_row[index]; col+=dir_col[index]; knight[row][col]=++step; seek(row,col); knight[row][col]=0; } } } //没什么说的,对照八皇后的代码,几乎一样;
再来给个扩展吧,迅雷的校招题里有这样一题:有n个骑士,分散于各点,每个骑士按“日”行走法,一天走一步,骑士可以在某处停留,等候其他骑士。求骑士全部相聚的最短天数。