#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
#define directions 8
class Step
{
public:
Step();
Step(int a,int b);
void get(Step current, int* possibleSteps, int number);
int x;
int y;
};
Step::Step() {
x=0;
y=0;
}
Step::Step(int a, int b) {
x=a;
y=b;
}
int count(int* possibleSteps) { //傳入紀錄可走方向的一維陣列
int c, i; //變數c用來接出路數量(初始值0)、變數i為8方向計數器
for(c = 0, i = 0; i < directions; i++) //檢查八個方向
if(possibleSteps[i]) { //如果這個方向有值(值為1或0而已)
c++; //出路數就+1
} //結束小if迴圈
return c; //回傳出路數量
} //count函式結束
void Step::get(Step current, int* possibleSteps, int number) { //傳入現在座標,已經記錄好可走方向的一維陣列,第幾條出路(最少為1)
const int idir[8]={-2,-1,1,2, 2, 1,-1,-2}; //能走的8個方向i值的變化
const int jdir[8]={ 1, 2,2,1,-1,-2,-2,-1}; //能走的8個方向j值的變化
int c=0, i=0;
for(c = 0, i = 0; i < directions; i++) if(possibleSteps[i]) {
c++;
if(c == number) {
break;
}
}
this->x=current.x+idir[i];
this->y=current.y+jdir[i];
}
void travel(int n)
{
const int dirs[8][2] = {{-2, 1}, {-1, 2}, {1, 2}, {2, 1},
{2, -1}, {1, -2}, {-1, -2}, {-2, -1}}; //八個方向的移動
int **board; //將來要輸出在螢幕上的棋盤
board=new int*[n]; //nXn陣列
for(int x=0;x<n;x++)
{
board[x]=new int[n];
}
for(int x=0;x<n;x++) //將board初始化
{
for(int y=0;y<n;y++)
board[x][y]=0;
}
board[0][0]=1; //起點為(0,0)
Step current=Step(0,0); //現今騎士的座標
int st; //代表步數計數器*/
for(st = 2; st <n*n+1; st++){ //走滿步(格)數就算完成*/
int possibleSteps[directions]={0}; //一維陣列,8方向*/
int k; //變數k為8方向計數器
for(k = 0; k < directions; k++) //run8個方向的for迴圈
{
Step s = Step(current.x + dirs[k][0], current.y + dirs[k][1]); //s代表往方向k後的座標位置
if( s.x > -1 && s.x < n &&s.y > -1 && s.y < n)//決定下個位置可不可以走
{
if(!board[s.x][s.y]) //而且這個位置沒有被佔據(值大於1即為被占據)
{
possibleSteps[k] = 1; //我們就把這個方向設定為1(值為1或0。1可以走,0不可以走)
}
} //if迴圈結束
} //for迴圈結束
int c = count(possibleSteps); //c代表現在這個位置有幾個出路
if(c == 0){ /*沒有出路即為死路,跳出迴圈*/
break;
}
if(c == 1) { /*如果只有一條出路,下一步只有一個可能*/
current.get(current, possibleSteps, 1);
}
else {
const int tdirs[8][2] = {{-2, 1}, {-1, 2}, {1, 2}, {2, 1}, {2, -1}, {1, -2}, {-1, -2}, {-2, -1}};
int minPossibleSteps[directions] = {0};
Step s1=Step();
s1.get(current, possibleSteps, 1);
int k;
for(k = 0; k < directions; k++)
{
Step ss = Step(s1.x + tdirs[k][0], s1.y + tdirs[k][1]); //s暫存第一條出路的下一個朝k方向移動後的座標
if(ss.x > -1 && ss.x < n && ss.y > -1 && ss.y < n ) //檢查s朝k方向移動後是否在合理的位子
{
if(!board[ss.x][ss.y])
{
minPossibleSteps[k] = 1; //若合理,k方向就紀錄可以走
}
}
}
int minIndex,i; //兩個變數,minIndex是最小出路陣列的索引值、i是計數器
for(minIndex = 0, i = 1; i < count(possibleSteps); i++)
{
int nextPossibleSteps[directions] = {0}; //設一個歸零過的一維陣列(大小為8)暫存第2條以上出路的可走方向
Step s2 = Step();
s2.get(current, possibleSteps, i + 1); //設s2來接下一個出路的座標。(get的第三個參數可以說是往第幾個出路移動)
int k;
for(k = 0; k < directions; k++) //將可走方向記錄到一維陣列裡
{
Step sss = Step(s2.x + tdirs[k][0], s2.y + tdirs[k][1]);
if(sss.x > -1 && sss.x < n && sss.y > -1 && sss.y < n )
{
if(!board[sss.x][sss.y])
{
nextPossibleSteps[k] = 1;
}
}
}
if(count(nextPossibleSteps) < count(minPossibleSteps))
{
minIndex = i; //i代表比第一個出路後的座標還擁有最少出路的第i個座標,索引值放進minIndex
int j; //變數j作為計數器
for(j = 0; j < directions; j++)
{ //把該座標哪些方向可通洗進去minPossibleSteps[j]
minPossibleSteps[j] = nextPossibleSteps[j];
}
}
} //end_for其他出路與決定要走哪個出路跑完
current.get(current, possibleSteps, minIndex+1);
}//end_else
board[current.x][current.y] = st; /*將當前步數位置設定到棋盤上*/
} /*結束for迴圈*/
int b; /*印出board*/
for(b = 0; b < n; b++) {
int j;
for(j = 0; j < n; j++) {
printf("%3d", board[b][j]);
}
printf("\n");
}
delete [] board;
} /*結束travel函式*/
int main() {
travel(5);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8Y3N0ZGxpYj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBkaXJlY3Rpb25zIDgKCmNsYXNzIFN0ZXAKewoJcHVibGljOgoJCVN0ZXAoKTsJCQoJCVN0ZXAoaW50IGEsaW50IGIpOwoJCXZvaWQgZ2V0KFN0ZXAgY3VycmVudCwgaW50KiBwb3NzaWJsZVN0ZXBzLCBpbnQgbnVtYmVyKTsJCQoJCWludCB4OyAKCQlpbnQgeTsgCQp9OwoKU3RlcDo6U3RlcCgpIHsKICAgIHg9MDsKICAgIHk9MDsKfQoKU3RlcDo6U3RlcChpbnQgYSwgaW50IGIpIHsKICAgIHg9YTsKICAgIHk9YjsKfQogCmludCBjb3VudChpbnQqIHBvc3NpYmxlU3RlcHMpIHsJCQkJCS8v5YKz5YWl57SA6YyE5Y+v6LWw5pa55ZCR55qE5LiA57at6Zmj5YiXCiAgICBpbnQgYywgaTsJCQkJCQkJCQkvL+iuiuaVuGPnlKjkvobmjqXlh7rot6/mlbjph48o5Yid5aeL5YC8MCnjgIHorormlbhp54K6OOaWueWQkeioiOaVuOWZqAogICAgZm9yKGMgPSAwLCBpID0gMDsgaSA8IGRpcmVjdGlvbnM7IGkrKykJCS8v5qqi5p+l5YWr5YCL5pa55ZCRCgkgaWYocG9zc2libGVTdGVwc1tpXSkgewkJCQkJCS8v5aaC5p6c6YCZ5YCL5pa55ZCR5pyJ5YC8KOWAvOeCujHmiJYw6ICM5beyKQogICAgIAkgICBjKys7CQkJCQkJCQkJLy/lh7rot6/mlbjlsLErMQogICAgCSAgIH0JCQkJCQkJCQkvL+e1kOadn+Wwj2lm6L+05ZyICiAgICByZXR1cm4gYzsJCQkJCQkJCQkvL+WbnuWCs+WHuui3r+aVuOmHjwp9CQkJCQkJCQkJCQkJLy9jb3VudOWHveW8j+e1kOadnwogCnZvaWQgU3RlcDo6Z2V0KFN0ZXAgY3VycmVudCwgaW50KiBwb3NzaWJsZVN0ZXBzLCBpbnQgbnVtYmVyKSB7CQkvL+WCs+WFpeePvuWcqOW6p+aome+8jOW3sue2k+iomOmMhOWlveWPr+i1sOaWueWQkeeahOS4gOe2remZo+WIl++8jOesrOW5vuaineWHuui3ryjmnIDlsJHngroxKQoJY29uc3QgaW50IGlkaXJbOF09ey0yLC0xLDEsMiwgMiwgMSwtMSwtMn07ICAvL+iDvei1sOeahDjlgIvmlrnlkJFp5YC855qE6K6K5YyWCgljb25zdCBpbnQgamRpcls4XT17IDEsIDIsMiwxLC0xLC0yLC0yLC0xfTsgIC8v6IO96LWw55qEOOWAi+aWueWQkWrlgLznmoTororljJYKICAgIGludCBjPTAsIGk9MDsJCiAgICBmb3IoYyA9IDAsIGkgPSAwOyBpIDwgZGlyZWN0aW9uczsgaSsrKSBpZihwb3NzaWJsZVN0ZXBzW2ldKSB7CiAgICAgICAgYysrOwogICAgICAgIGlmKGMgPT0gbnVtYmVyKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCXRoaXMtPng9Y3VycmVudC54K2lkaXJbaV07Cgl0aGlzLT55PWN1cnJlbnQueStqZGlyW2ldOwp9CiAKdm9pZCB0cmF2ZWwoaW50IG4pCnsKCWNvbnN0IGludCBkaXJzWzhdWzJdID0ge3stMiwgMX0sIHstMSwgMn0sIHsxLCAyfSwgICB7MiwgMX0sIAkgIAogICAgICAgICAgICAgICAgICAgICAgezIsIC0xfSwgezEsIC0yfSwgey0xLCAtMn0sIHstMiwgLTF9fTsgCSAgLy/lhavlgIvmlrnlkJHnmoTnp7vli5UKCWludCAqKmJvYXJkOyAgCQkJCQkJCQkJCQkJICAvL+Wwh+S+huimgei8uOWHuuWcqOieouW5leS4iueahOaji+ebpAoJYm9hcmQ9bmV3IGludCpbbl07ICAJCQkJCQkJCQkJICAvL25YbumZo+WIlwoJZm9yKGludCB4PTA7eDxuO3grKykKCXsKCQlib2FyZFt4XT1uZXcgaW50W25dOwoJfQoJZm9yKGludCB4PTA7eDxuO3grKykgIAkJCQkJCQkvL+Wwh2JvYXJk5Yid5aeL5YyWCgl7CgkJZm9yKGludCB5PTA7eTxuO3krKykKCQkJYm9hcmRbeF1beV09MDsKCX0KCWJvYXJkWzBdWzBdPTE7CQkJCQkJCQkJLy/otbfpu57ngrooMCwwKQoJCglTdGVwIGN1cnJlbnQ9U3RlcCgwLDApOwkJCQkJCQkvL+ePvuS7iumojuWjq+eahOW6p+aomQoJaW50IHN0OwkJCQkJCQkJCQkJLy/ku6PooajmraXmlbjoqIjmlbjlmagqLwoJZm9yKHN0ID0gMjsgc3QgPG4qbisxOyBzdCsrKXsJCQkJCS8v6LWw5ru/5q2lKOagvCnmlbjlsLHnrpflrozmiJAqLyAKCQlpbnQgcG9zc2libGVTdGVwc1tkaXJlY3Rpb25zXT17MH07CQkJLy/kuIDntq3pmaPliJfvvIw45pa55ZCRKi8KCQlpbnQgazsJCQkJCQkJCQkJLy/orormlbhr54K6OOaWueWQkeioiOaVuOWZqAogICAgCWZvcihrID0gMDsgayA8IGRpcmVjdGlvbnM7IGsrKykJCQkJLy9ydW445YCL5pa55ZCR55qEZm9y6L+05ZyICiAgICAJewkJCQkJCiAgICAgICAgCVN0ZXAgcyA9IFN0ZXAoY3VycmVudC54ICsgZGlyc1trXVswXSwgY3VycmVudC55ICsgZGlyc1trXVsxXSk7CS8vc+S7o+ihqOW+gOaWueWQkWvlvoznmoTluqfmqJnkvY3nva4gICAgIAkKCQkJaWYoIHMueCA+IC0xICYmIHMueCA8IG4gJiZzLnkgPiAtMSAmJiBzLnkgPCBuKS8v5rG65a6a5LiL5YCL5L2N572u5Y+v5LiN5Y+v5Lul6LWwCgkJCXsKICAgICAgICAgICAgCWlmKCFib2FyZFtzLnhdW3MueV0pIAkJCQkJLy/ogIzkuJTpgJnlgIvkvY3nva7mspLmnInooqvkvZTmk5oo5YC85aSn5pa8MeWNs+eCuuiiq+WNoOaTmikKICAgICAgICAgICAgCXsJCQkJCQkKICAgICAgICAgICAgCXBvc3NpYmxlU3RlcHNba10gPSAxOwkJCQkvL+aIkeWAkeWwseaKiumAmeWAi+aWueWQkeioreWumueCujEo5YC854K6MeaIljDjgIIx5Y+v5Lul6LWw77yMMOS4jeWPr+S7pei1sCkgICAgICAgIAkgCQoJCQkJfQoJCQl9CQkJCQkJCQkJCS8vaWbov7TlnIjntZDmnZ8gICAgIAkgCQogICAgCX0JCQkJCQkJCQkJCS8vZm9y6L+05ZyI57WQ5p2fCQoKICAgICAgICBpbnQgYyA9IGNvdW50KHBvc3NpYmxlU3RlcHMpOwkJCQkvL2Pku6Pooajnj77lnKjpgJnlgIvkvY3nva7mnInlub7lgIvlh7rot68gCgoJCWlmKGMgPT0gMCl7CQkJCQkJCQkJLyrmspLmnInlh7rot6/ljbPngrrmrbvot6/vvIzot7Plh7rov7TlnIgqLyAKCQkJYnJlYWs7CgkJfQoJCQoJCWlmKGMgPT0gMSkgewkJCQkJCQkJLyrlpoLmnpzlj6rmnInkuIDmop3lh7rot6/vvIzkuIvkuIDmraXlj6rmnInkuIDlgIvlj6/og70qLwogICAgICAgICAgY3VycmVudC5nZXQoY3VycmVudCwgcG9zc2libGVTdGVwcywgMSk7CiAgICAgIH0JCiAgICAgIAogICAgICAgIGVsc2UgewoJCQljb25zdCBpbnQgdGRpcnNbOF1bMl0gPSB7ey0yLCAxfSwgey0xLCAyfSwgezEsIDJ9LCB7MiwgMX0sIHsyLCAtMX0sIHsxLCAtMn0sIHstMSwgLTJ9LCB7LTIsIC0xfX07IAkJCQkJCQkJCQkJCgkJCWludCBtaW5Qb3NzaWJsZVN0ZXBzW2RpcmVjdGlvbnNdID0gezB9OyAgCiAgICAJCVN0ZXAgczE9U3RlcCgpOwoJCQlzMS5nZXQoY3VycmVudCwgcG9zc2libGVTdGVwcywgMSk7CgkJCQkKICAgIAkJaW50IGs7CQkJCQkJCQkJIAkJCiAgICAJCWZvcihrID0gMDsgayA8IGRpcmVjdGlvbnM7IGsrKykKCQkJewkJCQkJCiAgICAgICAJCQlTdGVwIHNzID0gU3RlcChzMS54ICsgdGRpcnNba11bMF0sIHMxLnkgKyB0ZGlyc1trXVsxXSk7CS8vc+aaq+WtmOesrOS4gOaineWHuui3r+eahOS4i+S4gOWAi+acnWvmlrnlkJHnp7vli5XlvoznmoTluqfmqJkgCiAgICAgICAgCQkJaWYoc3MueCA+IC0xICYmIHNzLnggPCBuICYmCXNzLnkgPiAtMSAmJiBzcy55IDwgbiApIC8v5qqi5p+lc+acnWvmlrnlkJHnp7vli5XlvozmmK/lkKblnKjlkIjnkIbnmoTkvY3lrZAKCQkJCQl7CgkJCQkJCWlmKCFib2FyZFtzcy54XVtzcy55XSkgCgkJCQkJCXsKICAgICAgICAgICAgCQkJbWluUG9zc2libGVTdGVwc1trXSA9IDE7CQkJCQkJLy/oi6XlkIjnkIbvvIxr5pa55ZCR5bCx57SA6YyE5Y+v5Lul6LWwIAogICAgICAgIAkJCQl9CQkKCSAgIAkJCQl9CgkJCX0KICAgIAkJaW50IG1pbkluZGV4LGk7CQkJCQkJCQkJCQkJLy/lhanlgIvorormlbjvvIxtaW5JbmRleOaYr+acgOWwj+WHuui3r+mZo+WIl+eahOe0ouW8leWAvOOAgWnmmK/oqIjmlbjlmagKCgkJCWZvcihtaW5JbmRleCA9IDAsIGkgPSAxOyBpIDwgY291bnQocG9zc2libGVTdGVwcyk7IGkrKykgCgkJCXsgCiAgICAgICAJCQlpbnQgbmV4dFBvc3NpYmxlU3RlcHNbZGlyZWN0aW9uc10gPSB7MH07ICAgICAgCQkJIC8v6Kit5LiA5YCL5q246Zu26YGO55qE5LiA57at6Zmj5YiXKOWkp+Wwj+eCujgp5pqr5a2Y56ysMuaineS7peS4iuWHuui3r+eahOWPr+i1sOaWueWQkSAKICAgICAgIAkJCVN0ZXAgczIgPSBTdGVwKCk7CgkJCQlzMi5nZXQoY3VycmVudCwgcG9zc2libGVTdGVwcywgaSArIDEpOyAgCQkJCSAvL+iorXMy5L6G5o6l5LiL5LiA5YCL5Ye66Lev55qE5bqn5qiZ44CCKGdldOeahOesrOS4ieWAi+WPg+aVuOWPr+S7peiqquaYr+W+gOesrOW5vuWAi+WHuui3r+enu+WLlSkgCQoJCQkJaW50IGs7CQkJCQkJCQkJCQkKICAgIAkJCWZvcihrID0gMDsgayA8IGRpcmVjdGlvbnM7IGsrKykgCQkJCQkJLy/lsIflj6/otbDmlrnlkJHoqJjpjITliLDkuIDntq3pmaPliJfoo6EKCQkJCXsJCQkJCQkgCiAgICAgICAJCQkJU3RlcCBzc3MgPSBTdGVwKHMyLnggKyB0ZGlyc1trXVswXSwgczIueSArIHRkaXJzW2tdWzFdKTsgCQogICAgICAgCQkJCWlmKHNzcy54ID4gLTEgJiYgc3NzLnggPCBuICYmIHNzcy55ID4gLTEgJiYgc3NzLnkgPCBuICkKICAgICAgIAkJCQl7CgkgICAgCSAgIAkJCWlmKCFib2FyZFtzc3MueF1bc3NzLnldKSAKCQkJCQkJewogICAJCSAgICAgICAgIAkJbmV4dFBvc3NpYmxlU3RlcHNba10gPSAxOwogICAgICAgIAkJCQl9CQogICAgICAgCQkJCX0gICAgICAgCQkKCQkJCX0JCiAgICAgICAgCQkJaWYoY291bnQobmV4dFBvc3NpYmxlU3RlcHMpIDwgY291bnQobWluUG9zc2libGVTdGVwcykpIAoJCQkJCXsKICAgICAgICAgICAgCQkJbWluSW5kZXggPSBpOwkJCQkJCQkJCQkvL2nku6Pooajmr5TnrKzkuIDlgIvlh7rot6/lvoznmoTluqfmqJnpgoTmk4HmnInmnIDlsJHlh7rot6/nmoTnrKxp5YCL5bqn5qiZ77yM57Si5byV5YC85pS+6YCybWluSW5kZXgKICAgICAgICAgICAgCQkJaW50IGo7CQkJCQkJCQkJCQkJLy/orormlbhq5L2c54K66KiI5pW45ZmoCiAgICAgICAgICAgIAkJCWZvcihqID0gMDsgaiA8IGRpcmVjdGlvbnM7IGorKykgCgkJCQkJCXsJCQkJCQkJCQkJCQkJLy/mioroqbLluqfmqJnlk6rkupvmlrnlkJHlj6/pgJrmtJfpgLLljrttaW5Qb3NzaWJsZVN0ZXBzW2pdCiAgICAgICAgICAgICAJCSAJICAJbWluUG9zc2libGVTdGVwc1tqXSA9IG5leHRQb3NzaWJsZVN0ZXBzW2pdOwogICAgICAgICAgICAJCQl9CiAgICAgICAgCQkJfQogICAJCQl9CQkJCQkJCQkJCQkvL2VuZF9mb3Llhbbku5blh7rot6/oiIfmsbrlrpropoHotbDlk6rlgIvlh7rot6/ot5HlrowgIAoJY3VycmVudC5nZXQoY3VycmVudCwgcG9zc2libGVTdGVwcywgbWluSW5kZXgrMSk7CiAgICAJfS8vZW5kX2Vsc2UJCQkJCQkJCQkJCQpib2FyZFtjdXJyZW50LnhdW2N1cnJlbnQueV0gPSBzdDsJCQkJCQkvKuWwh+eVtuWJjeatpeaVuOS9jee9ruioreWumuWIsOaji+ebpOS4iiovCgoJfQkJCQkJCQkJCQkJCQkvKue1kOadn2Zvcui/tOWciCovCgkJCiAgICBpbnQgYjsJCQkJCQkJCQkJCQkvKuWNsOWHumJvYXJkKi8KICAgIGZvcihiID0gMDsgYiA8IG47IGIrKykgewogICAgICAgIGludCBqOwogICAgICAgIGZvcihqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICBwcmludGYoIiUzZCIsIGJvYXJkW2JdW2pdKTsKICAgICAgICB9CgkgICAgICBwcmludGYoIlxuIik7CiAgCSAgfQogIAkgIApkZWxldGUgW10gYm9hcmQ7Cgp9CQkJCQkJCQkJCQkJCQkvKue1kOadn3RyYXZlbOWHveW8jyovCQogCmludCBtYWluKCkgewoJCiAgICB0cmF2ZWwoNSk7CiAgICByZXR1cm4gMDsKfSA=