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();

    }

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

  • 相关阅读:
    应用Druid监控SQL语句的执行情况
    J2EE应用监控后台执行SQL
    maven环境搭建
    【机器学习】Sklearn库主成分分析PCA降维的运用实战
    PCA降维算法
    80行Python实现-HOG梯度特征提取(转载)
    HOG特征提取算法原理(转载)
    数据预处理方法 总结
    【AI换脸】Faceswap源代码换脸软件安装指南(转)
    人工智能领域的会议和期刊(转载)
  • 原文地址:https://www.cnblogs.com/ruofengzhishang/p/2179832.html
Copyright © 2011-2022 走看看