鱼C论坛

 找回密码
 立即注册
查看: 2606|回复: 0

[学习笔记] 《数据结构与算法》——图的遍历搜索

[复制链接]
发表于 2017-8-17 14:01:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
DFS:
从图中任意一点开始,按照特点规则(如先往右手侧的边走)遍历每一条边,每经过一个点,就标记一次,当遇到标记过的点就返回到上一个点

马踏棋盘问题:
本问题算法核心在于合理的利用递归来遍历二维数组,这里的图是利用一个二维数组来实现和表示的。通过遍历,马在棋盘任意位置可以移动的位置最多有8个,我们要做的就是不断地找到这些可能的位置,一直到某一个位置无法移动,返回函数至上一个位置,选择其他可能移动的位置,直至找到一个可能的移动路径完成对棋盘所有位置的移动。

附上马踏棋盘的代码:
#include<cstdio>
#include<cstdlib>
#include<time.h>
#include<iostream>
using namespace std;

#define X 8
#define Y 8
int chess[X][Y];
int a = 0;

//验证下一步是否可行
int IsHaveNext(int *x, int *y, int counts)
{
        int x1=*x, y1=*y;
        switch (counts)
        {
        case 0:
                if (x1 - 1 >= 0 && y1 - 2 >= 0 && chess[x1 - 1][y1 - 2] == 0)
                {
                        *x = x1 - 1;
                        *y = y1 - 2;
                        return 1;
                }
                break;
        case 1:
                if (x1 + 1 <= X-1 && y1 - 2 >= 0 && chess[x1 + 1][y1 - 2] == 0)
                {
                        *x = x1 + 1;
                        *y = y1 - 2;
                        return 1;
                }
                break;
        case 2:
                if (x1 + 2 <= X - 1 && y1 - 1 >= 0 && chess[x1 + 2][y1 - 1] == 0)
                {
                        *x = x1 + 2;
                        *y = y1 - 1;
                        return 1;
                }
                break;
        case 3:
                if (x1 + 2 <= X - 1 && y1 + 1 <= Y - 1 && chess[x1 + 2][y1 + 1] == 0)
                {
                        *x = x1 + 2;
                        *y = y1 + 1;
                        return 1;
                }
                break;
        case 4:
                if (x1 + 1 <= X - 1 && y1 + 2 <= Y - 1 && chess[x1 + 1][y1 + 2] == 0)
                {
                        *x = x1 + 1;
                        *y = y1 + 2;
                        return 1;
                }
                break;
        case 5:
                if (x1 - 1 >= 0 && y1 + 2 <= Y - 1 && chess[x1 - 1][y1 + 2] == 0)
                {
                        *x = x1 - 1;
                        *y = y1 + 2;
                        return 1;
                }
                break;
        case 6:
                if (x1 - 2 >= 0 && y1 + 1 <= Y-1 && chess[x1 -2][y1 + 1] == 0)
                {
                        *x = x1 - 2;
                        *y = y1 + 1;
                        return 1;
                }
                break;
        case 7:
                if (x1 - 2 >= 0 && y1 - 1 >= 0 && chess[x1 - 2][y1 - 1] == 0)
                {
                        *x = x1 - 2;
                        *y = y1 - 1;
                        return 1;
                }
                break;
        defaule:
                break;
        }
        return 0;
}

//打印棋盘
void print()
{
        for (int i = 0; i < X; i++)
        {
                for (int j = 0; j < Y; j++)
                {
                        printf("%3d", chess[i][j]);
                }
                cout << endl;
        }
        cout << endl;
}

//搜素下一步
int TravelChess(int x, int y, int tag)
{
        int count = 0, flag = 0;
        int x1 = x, y1 = y;
        chess[x1][y1] = tag;
        if (X*Y == tag)
        {
                print();//打印棋盘
                return 1;
        }

        while (flag!=1&&count <= 7)
        {
                flag = IsHaveNext(&x1, &y1, count);
                count++;
        }

        while (flag)
        {
                if (TravelChess(x1, y1, tag+1))
                {
                        return 1;
                }
                x1 = x, y1 = y;
                flag = 0;
                while (flag != 1 && count <= 7)
                {
                        flag = IsHaveNext(&x1, &y1, count);
                        count++;
                }
        }

        if (flag == 0)
        {
                chess[x][y] = 0;

        }
        return 0;
}

int main()
{
        clock_t s, e;
        int x, y;
        cout << "input the initial position:" << endl;
        cin >> x;
        cin >> y;
        s = clock();
        if (!TravelChess(x, y, 1))
        {
                cout << "Failed !" << endl;
        }

        e = clock();
        cout <<endl<< "used time = " << (double)(e - s) / CLOCKS_PER_SEC << endl;

        system("PAUSE");
}

评分

参与人数 1鱼币 +2 收起 理由
小甲鱼 + 2

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 00:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表