TOP

DFS(二):骑士游历问题(一)
2019-07-08 22:10:32 】 浏览:175
Tags:DFS 骑士 游历 问题

      在国际象棋的棋盘(8行×8列)上放置一个马,按照马走日字的规则,马要遍历棋盘,即到达棋盘上的每一格,并且每格只到达一次。例如,下图给出了骑士从坐标(1,5)出发,游历棋盘的一种可能情况。

【例1】骑士游历问题。

       编写一个程序,对于给定的起始位置(x0,y0),探索出一条路径,沿着这条路径骑士能遍历棋盘上的所有单元格。

       (1)编程思路。

        采用深度优先搜索进行路径的探索。深度优先搜索用递归描述的一般框架为:

    void  dfs(int deep)      //  对deep层进行搜索

    {

          if  (符合某种要求||已经不能在搜了)

         {

               按要求进行一些处理,一般为输出;

               return ;

         }

         if   (符合某种条件且有地方可以继续搜索的)   // 这里可能会有多种情况,可能要循环什么的

        {

             vis[x][y]=1;                       //  表示结点(x,y)已访问到

             dfs(deep+1);                    //  搜索下一层

             vis[x][y]=0;                      // 改回来,表示结点(x,y)以后可能被访问
        }
    } 

      定义数组int vis[10][10]记录骑士走到的步数,vis[x][y]=num表示骑士从起点开始走到坐标为(x,y)的格子用了num步(设起点的步数为1)。初始时vis数组元素的值全部为0。

 (2)源程序。

#include <stdio.h>

#include <stdlib.h>

int N,M;

int vis[10][10]={0};

// 定义马走的8个方向

int dir_x[8] = {-1,-2,-2,-1,1,2,2,1};

int dir_y[8] = {2,1,-1,-2,-2,-1,1,2};

void print()

{

       int i,j;

       for(i=0; i<N; i++)

       {

           for(j=0; j<M; j++)

               printf("%3d ",vis[i][j]);

           printf("\n");

        }

}

void DFS(int cur_x,int cur_y,int step)

{

   if(step==N*M+1 )

   {

        print();

        exit(1);

   } 

   int next_x,next_y;

   for(int i=0; i<8; i++)

   {

     next_x = cur_x+dir_x[i];

     next_y = cur_y+dir_y[i];

     if (next_x<0 || next_x>=N || next_y<0 || next_y>=M || vis[next_x][next_y]!=0)

          continue;

     vis[next_x][next_y] = step;

     DFS(next_x,next_y,step+1);

     vis[next_x][next_y] = 0;

   }

}

int main()

{

   printf("请输入棋盘的行数和列数(均小于10):");

   scanf("%d %d",&am
DFS(二):骑士游历问题(一) https://www.cppentry.com/bencandy.php?fid=49&id=227408

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇基数排序的优雅实现 下一篇QT防止程序多次启动