设计程序完成如下要求:
在中国象棋盘上,对任意位置上放置一个马,均能选择一个合适的路线,使得该棋子能够按照象棋的规则不重复的走过棋盘上的每一位置。
要求:
(1)依次输出走过的各位置的坐标
(2)最好能画出棋盘的图形形式,并在其上动态的标注行走过程
思路:最开始用的是dfs,但是递归层数多的时候就无法在短时间内出结果,所以需要用这种贪心的思想。从起点开始,在每个结点对其子结点进行选取时,优先选择子节点可落子位置最少的结点。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int dir[8][2]={
{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}}; //八个方向
int nexti[8],nextj[8];
int board[100][100];
int exists[8]; //记录当前点的下一个点的出路数
int nn,mm;
int slove(int x,int y)
{
memset(board,0,sizeof(board));
memset(exists,0,sizeof(exists));
memset(nexti,0,sizeof(nexti));
memset(nextj,0,sizeof(nextj));
int cnt,t,minx,tmp;
board[x][y] = 1;
for(int i=2;i<=nn*mm;++i){
for(int k=0;k<8;++k){
exists[k] = 0; //初始化出路的个数为0
}
t = 0;
for(int j=0;j<8;++j){
int nx = x + dir[j][0];
int ny