馬踏棋盤很好實現,但有時執行起來特別慢,還可能出不來結果,在這裡要用到貪心演算法來優化,
即找出最難走的路徑,也就是下下步可下棋的位置最少。
下面給出該演算法完整**:
/*
* 馬踏棋盤問題:(貪婪法求解)
* 棋盤有64個位置,「日」字走法,剛好走滿整個棋盤
*///下乙個走法的方向類
class direction
public
class
hores_chessboard_1 ; // x方向的增量
static
final
int dy = ; // y方向的增量
static
final
int n = 8;
static
int chessboard = new
int[n][n]; // 棋盤
/** *
*@param nami
*@param x,y為棋子的位置
*@return 如果棋子的位置不合法,則返回乙個大於8的數。
* 否則返回棋子的下個出路的個數
*/static
int wayout(int x, int y)
for(i=0; i//如果棋子的下個出路可行,則出路數自加一次
if(tx>-1 && tx<8 && ty>-1 && ty<8 && chessboard[tx][ty]==0)
count++;
}return count;
}/**
* 按照棋子的下個出路的個數從低到高排序
*@param next 棋子的八個位置的陣列
*/static
void sort(direction next)
if(i != index)}}
static
void move(int x, int y, int step)
system.out.println();
}system.exit(0);
}//下乙個棋子的n個位置的陣列
direction next = new direction[n];
for(i=0; inew direction();
temp.x = x+dx[i];
temp.y = y+dy[i];
next[i] = temp;
//迴圈得到下個棋子n處位置的下個出路的個數
next[i].wayoutnum = wayout(temp.x, temp.y);
}//配合貪婪演算法,按下個棋子的下個出路數排序後,next[0]就是下個出路數最少的那個
sort(next);
for(i=0; i1);
/*如果上面move()往下一步走不通,則回溯到這裡
重置chessboard[tx][ty]為0,接著i++,又迴圈...... */
chessboard[tx][ty] = 0;}}
public
static
void
main(string args)
}system.out.println("請輸入棋子開始位置(0-7):");
scanner sc = new scanner(system.in);
int x = sc.nextint();
int y = sc.nextint();
//第一步不用比較,賦值第一步
chessboard[x][y] = 1;
move(x, y, 2);
}}
回溯演算法(馬踏棋盤)
近期學習了回溯演算法於是自己寫了馬踏棋盤的遞迴以及非遞迴方式的 theme 馬踏棋盤 回溯演算法 coder 秒針的聲音 time 2015.1.11 include include include define m 8 typedef struct nodehorse horse horse1 i...
馬踏棋盤演算法
為.c檔案 include include include define rows 8 define cols 8 int cheesboard rows cols const int movex 8 const int movey 8 初始化棋盤,將棋盤所有的位置賦值為0 void initboa...
馬踏棋盤演算法
將馬隨機放在西洋棋的board 0 7 0 7 的某個方格中,馬按走棋規則進行移動。走遍棋盤上全部64個方格。編制非遞迴程式,求出馬的行走路線,並按求出的行走路線,將數字1,2,64依次填入乙個8 8的方陣,輸出之。利用回溯法的思想,馬的走法總共有8,c 8 b 8 c是橫座標,b是縱座標。總共有6...