zoukankan      html  css  js  c++  java
  • C语言之算法初步(骑士周游世界)

    #include<iostream>

    using namespace std;

    #define N 6

    int ditu[N][N] = 

    {

    {0, 0, 0, 0, 0, 0},

    {0, 0, 0, 0, 0, 0},

    {0, 0, 0, 0, 0, 0},

    {0, 0, 0, 0, 0, 0},

    {0, 0, 0, 0, 0, 0},

    {0, 0, 0, 0, 0, 0}

    };

    int flag = 0;

    int go(int x, int y)

    {

    flag++;

    ditu[x][y] = flag; //将骑士走的路径记录

    if (flag >= (N * N)) //判断是否走完整个地图

    return flag;

    //8方向探路

    if ((((x - 2) >= 0) && ((x - 2) < N)) && (((y - 1) >= 0) && ((y - 1) < N)) && (ditu[x - 2][y - 1] == 0))

    go(x - 2, y - 1);

    if ((((x - 2) >= 0) && ((x - 2) < N)) && (((y + 1) >= 0) && ((y + 1) < N)) && (ditu[x - 2][y + 1] == 0))

    go(x - 2, y + 1);

    if ((((x - 1) >= 0) && ((x - 1) < N)) && (((y + 2) >= 0) && ((y + 2) < N)) && (ditu[x - 1][y + 2] == 0))

    go(x - 1, y + 2);

    if ((((x + 1) >= 0) && ((x + 1) < N)) && (((y + 2) >= 0) && ((y + 2) < N)) && (ditu[x + 1][y + 2] == 0))

    go(x + 1, y + 2);

    if ((((x + 2) >= 0) && ((x + 2) < N)) && (((y + 1) >= 0) && ((y + 1) < N)) && (ditu[x + 2][y + 1] == 0))

    go(x + 2, y + 1);

    if ((((x + 2) >= 0) && ((x + 2) < N)) && (((y - 1) >= 0) && ((y - 1) < N)) && (ditu[x + 2][y - 1] == 0))

    go(x + 2, y - 1);

    if ((((x + 1) >= 0) && ((x + 1) < N)) && (((y - 2) >= 0) && ((y - 2) < N)) && (ditu[x + 1][y - 2] == 0))

    go(x + 1, y - 2);

    if ((((x - 1) >= 0) && ((x - 1) < N)) && (((y - 2) >= 0) && ((y - 2) < N)) && (ditu[x - 1][y - 2] == 0))

    go(x - 1, y - 2);

    //当没有出路的时候还原

    if (flag < (N * N))

    {

    ditu[x][y] = 0;

    flag--;

    }

    return flag;

    }

    int main()

    {

    go(0, 0); //设置从0,0开始出发

    //输出路径

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

    {

    for (int j = 0; j < N; j++)

    {

    printf("%4d",ditu[i][j]);

    }

    cout<<endl;

    }

    int x;

    cin>>x;

    }

    不知道是不是递归的原因,还是代码本身有问题,发现当地图大于6*6时结果出不来,先留个记号,有空了继续改进

    改进版:

    #include <stdio.h>

    #include <windows.h>

    #pragma comment(lib, "winmm.lib")

    #define N 8

    int ditu[N][N] = 

    {

    {0, 0, 0, 0, 0, 0, 0, 0},

    {0, 0, 0, 0, 0, 0, 0, 0},

    {0, 0, 0, 0, 0, 0, 0, 0},

    {0, 0, 0, 0, 0, 0, 0, 0},

    {0, 0, 0, 0, 0, 0, 0, 0},

    {0, 0, 0, 0, 0, 0, 0, 0},

    {0, 0, 0, 0, 0, 0, 0, 0},

    {0, 0, 0, 0, 0, 0, 0, 0}

    };

    int path[N][N];

    int flag = 0;

    int incX[] = {1,  2,  2, 1, -1, -2, -2, -1};

    int incY[] = {-2, -1, 1, 2,  2,  1, -1, -2};

    void go(int n, int x, int y)

    {

    if (n >= (N * N)) //判断是否走完整个地图

    {

    flag = 1;

    path[x][y] = n;

    }

    if (flag == 1)

    return;

    path[x][y] = n; //将骑士走的路径记录

    ditu[x][y] = 1;

    //8方向探路

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

    if ((((x + incX[i]) >= 0) && ((x + incX[i]) < N)) && (((y + incY[i]) >= 0) && ((y + incY[i]) < N)) && (ditu[x + incX[i]][y + incY[i]] == 0))

    go(n + 1, x + incX[i], y + incY[i]);

    ditu[x][y] = 0;

    return;

    }

    int main()

    {

    int t;

    t = timeGetTime();

    go(1, 0, 0); //设置从0,0开始出发

    printf("Time = %d ms\n\n", timeGetTime() - t);

    //输出路径

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

    {

    for (int j = 0; j < N; j++)

    {

    printf("%4d",path[i][j]);

    }

    printf("\n");

    }

    getchar();

    }

    总算还是完成了,哈哈。。。。

  • 相关阅读:
    LearnMoreStudyLess《如何高效学习》斯科特.杨
    Asp.net 生成多个Excel打包zip进行下载(建立在Aspose.Cells.dll生成Excel,建立在ICSharpCode.SharpZipLib.dll打包zip)
    【面经】美团测试1,2,3面,一起来聊聊?
    【python】面试高频:浅拷贝 vs 深拷贝、'==' vs 'is'
    【图解Http 学习摘要】五、HTTPS 中的加密、证书介绍,不一直使用 HTTPS 的原因
    【图解Http 学习摘要】四、HTTP 缺点
    【图解Http 学习摘要】三、HTTP 协议基础、四次挥手
    【图解Http 学习摘要】二、IP,TCP 和 DNS、三次握手
    【图解Http 学习摘要】一、http介绍、TCP/IP 协议族
    【杂谈】关于常见架构的整理,单应用、微服务、SOA、分布式和集群
  • 原文地址:https://www.cnblogs.com/ruofengzhishang/p/2179832.html
Copyright © 2011-2022 走看看