马的Hamilton周游路线问题

来源:互联网 发布:快速傅里叶变换 知乎 编辑:程序博客网 时间:2024/05/21 01:51
#include "iostream"#include "iomanip"#include "cstdlib"using namespace std;int board[100][100];int dx[8] = {-2, -1, 1,  2, -2, -1, 2, 1};  //马可走的八个方向int dy[8] = {-1, -2, -2, -1, 1,  2, 1, 2};int n, m;  //棋盘为m * nint startx, starty;  //马的起点坐标//如果坐标出界,或该棋盘格已走过,则返回0,否则返回1int ok(int x, int y){    if(x<1 || y<1 || x>m || y>n || board[x][y]!=0)        return 0;    return 1;}//打印路线void print(int n, int m){    for(int i=1; i<=m; i++)    {        for(int j=1; j<=n; j++)            cout << setw(3) << board[i][j];        cout << endl;    }}int restart(int x, int y)  //判断下一步是否可以回到起点{    for(int i=0; i<8; i++)        if(x+dx[i]==startx && y+dy[i]==starty)            return 1;    return 0;}void backtrack(int x, int y, int count){     if(count == n * m && restart(x, y))  //如果走完棋盘,且回到起点    {        print(n, m);        exit(1);    }    for(int i=0; i<8; i++)  //每到一个格子,都有八个方向    {        int xx = x + dx[i];        int yy = y + dy[i];        if(ok(xx, yy))  //如果坐标正常        {            board[xx][yy] = count + 1;            backtrack(xx, yy, count + 1);            board[xx][yy] = 0;  //回溯        }    }}int main(){    cout << "输入棋盘行数:";     cin >> m;    cout << "输入棋盘列数:";    cin >> n;    memset(board, 0, sizeof(board));    cout << "输入马的起始坐标:";    cin >> startx >> starty;    board[startx][starty] = 1;    int number = 1;    cout << "路线为:\n";    backtrack(startx, starty, number);    return 0;} 

这里写图片描述

1 1