码迷,mamicode.com
首页 > 其他好文 > 详细

马的遍历问题

时间:2014-10-29 14:49:52      阅读:486      评论:0      收藏:0      [点我收藏+]

标签:回溯思想   dfs   acm   

题意如下:

马的遍历问题。设计程序完成如下要求:
在中国象棋棋盘上,对任一位置上放置的一个“马”.
均能选择一个合适的路线,使得该棋子能按象棋的规则
不重复地走过棋盘上的每一位置。


思路:这是一个DFS搜索,然后没有使用另外的数组来标记某一位置是否已经被走过,而是直接使用存步数的数组num[][]来作为标记数组!


然后我使用了两个数组作为方向坐标,以便能让马移动,同时也能记录马所在位置的坐标!(马是可以从8个移动方向中选择的!)


代码还是很好理解的!

至于棋盘的规格可以自己设定,我这里是使用的8x8的棋盘!


代码如下:

/*
马的遍历问题。设计程序完成如下要求:
在中国象棋棋盘上,对任一位置上放置的一个“马”.
均能选择一个合适的路线,使得该棋子能按象棋的规则
不重复地走过棋盘上的每一位置。程序输出8×8方阵.
*/
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int num[8][8],ans,step,n,m;
int xx[8]= {2,1,-1,-2,-2,-1,1,2};
int yy[8]= {1,2,2,1,-1,-2,-2,-1};
bool is_ok(int x,int y)
{
    if(x<0||x>7||y>7||y<0)
        return false;
    if(num[x][y])//不等于0表明这个位置已经被走过了!
        return false;
    return true;
}
void print()
{
    ans++;
    printf("第【%d】个走法:\n",ans);
    for(int i=0; i<8; i++)
    {
        for(int j=0; j<8; j++)
            printf("%4d",num[i][j]);
        printf("\n");
    }
    printf("\n");
    return ;
}
void dfs(int x,int y,int step)
{
    for(int i=0; i<8; i++)
    {
        int X=xx[i]+x;
        int Y=yy[i]+y;
        if(is_ok(X,Y))
        {
            num[X][Y]=step;
            if(64==step)
                print();
            else
                dfs(X,Y,step+1);
            num[X][Y]=0;
        }
    }
}
int main()
{
    int x,y;
    printf("请输入出发坐标:");
    scanf("%d%d",&x,&y);
    memset(num,0,sizeof(num));
    num[x][y]=1;
    ans=0;
    dfs(x,y,2);
    if(!ans)
    cout<<"没有合适的走法满足要求!\n";
    cout<<"到此结束了...\n";
    return 0;
}

bubuko.com,布布扣

马的遍历问题

标签:回溯思想   dfs   acm   

原文地址:http://blog.csdn.net/u014004096/article/details/40585983

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!