DFS解马走日问题

来源:互联网 发布:管家婆软件服务电话 编辑:程序博客网 时间:2024/05/22 23:59
问题描述

在n*n的棋盘中,马只能走"日"字。马从位置(0,0)出发,把棋盘的每一格都走一次且只走一次。找出所有路径。 5*5的棋盘上,有304种解。


问题分析
搜索过程是从(0,0)出发,按照深度优先的原则,从8个方向中尝试一个可以走的点,直到尝试过所有的方向,走完棋盘上的所有点,得出所有的解。

马走日问题可以看成是在层数为n*n的8叉树中,找出所有的解。

#include "stdio"int N =5;//棋盘大小为5*5int martic[N][N];//代表棋盘的数组int count = 0;//走的步数int solution = 0;//方法数量int step[8][2] = {{-1,-2},{-2,-1}, {-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}};//要走的八个方向int isok(int x,int y)//判断这一步是否符合规则{if ((x>=0&&x<N&&y>=0&&y<N&&martic == 0)){return true;}else{return false;}}void display()//如果整个棋盘已经走满,就输出整个棋盘{printf("the %d solution:\n",++solution);for(int i = 0;i < N;i++){for(int j = 0;j < N;j++){printf("%d  ",martic[i][j]);}printf("\n");}}void DFS(int x,int y){int nextx,nexty;for (int i = 0; i < 8; ++i){nextx = x + step[i][0];nexty = y + step[i][1];if (isok(nextx,nexty))//发现{if (count != (N*N-1)){count++;martic[nextx][nexty] = count;DFS(nextx,nexty);//递进 和 回溯martic[nextx][nexty] = 0;count--;}else{display();//满足条件,输出}}}}int int main(int argc, char const *argv[]){count = 1;martic[0][0] = 1;DFS(0,0);return 0;}




0 0
原创粉丝点击