069.骑士巡游

简介: 069.骑士巡游
//
/*                       骑士巡游问题                                   */
/
#include <stdio.h>
int f[11][11] ;                                /*定义一个矩阵来模拟棋盘*/
int adjm[121][121];/*标志矩阵,即对于上述棋盘,依次进行编号
        1--121(行优先)可以从一个棋盘格i跳到棋盘格j时,adjm[i][j]=1*/
void creatadjm(void);                            /*创建标志矩阵函数声明*/
void mark(int,int,int,int);                     /*将标志矩阵相应位置置1*/
void travel(int,int);                                    /*巡游函数声明*/
int n,m;                                 /*定义矩阵大小及标志矩阵的大小*/
/******************************主函数***********************************/
int main()
{
    int i,j,k,l;
    printf("Please input size of the chessboard: ");  /*输入矩阵的大小值*/
  scanf("%d",&n);
    m=n*n;
    creatadjm();                                         /*创建标志矩阵*/
  puts("The sign matrix is:");
    for(i=1;i<=m;i++)                                /*打印输出标志矩阵*/
    {
        for(j=1;j<=m;j++) 
      printf("%2d",adjm[i][j]);
        printf("\n");
    }
    printf("Please input the knight's position (i,j): "); /*输入骑士的初始位置*/
    scanf("%d %d",&i,&j);
    l=(i-1)*n+j;                   /*骑士当前位置对应的标志矩阵的横坐标*/
    while ((i>0)||(j>0))                             /*对骑士位置的判断*/
    {
        for(i=1;i<=n;i++)                              /*棋盘矩阵初始化*/
            for(j=1;j<=n;j++)
                f[i][j]=0;
        k=0;                                             /*所跳步数计数*/
        travel(l,k);                                /*从i,j出发开始巡游*/
        puts("The travel steps are:");
        for(i=1;i<=n;i++)                      /*巡游完成后输出巡游过程*/
    {
            for(j=1;j<=n;j++) 
          printf("%4d",f[i][j]);
            printf("\n");
    }
        printf("Please input the knight's position (i,j): ");/*为再次巡游输入起始位置*/
      scanf("%d %d",&i,&j);
        l=(i-1)*n+j;
    }
  puts("\n Press any key to quit... ");
  getch();
    return 0;
}
/*****************************创建标志矩阵子函数*************************/
void creatadjm()
{
    int i,j;
    for(i=1;i<=n;i++)                                   /*巡游矩阵初始化*/
        for(j=1;j<=n;j++)
            f[i][j]=0;
    for(i=1;i<=m;i++)                                   /*标志矩阵初始化*/
        for(j=1;j<=m;j++)
            adjm[i][j]=0;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(f[i][j]==0)           /*对所有符合条件的标志矩阵种元素置1*/
      {
                f[i][j]=1;
                if((i+2<=n)&&(j+1<=n)) mark(i,j,i+2,j+1);
                if((i+2<=n)&&(j-1>=1)) mark(i,j,i+2,j-1);
                if((i-2>=1)&&(j+1<=n)) mark(i,j,i-2,j+1);
                if((i-2>=1)&&(j-1>=1)) mark(i,j,i-2,j-1);
                if((j+2<=n)&&(i+1<=n)) mark(i,j,i+1,j+2);
                if((j+2<=n)&&(i-1>=1)) mark(i,j,i-1,j+2);
                if((j-2>=1)&&(i+1<=n)) mark(i,j,i+1,j-2);
                if((j-2>=1)&&(i-1>=1)) mark(i,j,i-1,j-2);
      } 
    return;
}
/*********************************巡游子函数*******************************/
void travel(int p,int r)
{
    int i,j,q;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(f[i][j]>r) f[i][j]=0;              /*棋盘矩阵的置〉r时,置0*/
    r=r+1;                                                   /*跳步计数加1*/
    i=((p-1)/n)+1;                                  /*还原棋盘矩阵的横坐标*/
    j=((p-1)%n)+1;                                  /*还原棋盘矩阵的纵坐标*/
    f[i][j]=r;                              /*将f[i][j]做为第r跳步的目的地*/
    for(q=1;q<=m;q++)           /*从所有可能的情况出发,开始进行试探式巡游*/
  {
        i=((q-1)/n)+1;
        j=((q-1)%n)+1;
        if((adjm[p][q]==1)&&(f[i][j]==0)) 
      travel(q,r);                                    /*递归调用自身*/
    }
    return;
}
/*************************赋值子函数***************************************/
void mark(int i1,int j1,int i2,int j2)
{
    adjm[(i1-1)*n+j1][(i2-1)*n+j2]=1;
    adjm[(i2-1)*n+j2][(i1-1)*n+j1]=1;
    return;
}
相关文章
|
存储 自然语言处理 Cloud Native
云数据仓库ADB问题之全文索引检索字段过长时条件会失效如何解决
云数据仓库AnalyticDB是阿里云提供的一种高性能、弹性扩展的云原生数据仓库解决方案;本合集将深入探讨ADB的架构、性能调优、数据管理和应用场景等,以及如何解决在使用过程中可能出现的问题,提高数据仓库的使用效率。
211 4
|
Rust JavaScript Go
2024年十大值得关注的编程语言
探索2024年最有影响力的编程语言:Python的多功能无与伦比,JavaScript在Web领域的统治地位,Rust的高效性,等等。
|
缓存 NoSQL 安全
Linux设备驱动程序(四)——调试技术3
Linux设备驱动程序(四)——调试技术3
326 0
|
12月前
|
传感器 人工智能 监控
智能水质监测:水源保护与污染控制
【10月更文挑战第24天】智能水质监测技术结合了先进的信息技术、通信技术和传感技术,实现对水质的实时监测、分析与预警,旨在提高水资源利用效率、保障公共健康、维护生态平衡、追踪污染源并建立预警机制。通过传感器、通信技术、数据处理与智能控制技术的综合应用,该技术为水资源保护提供了科学依据和有效手段,促进了水资源的可持续发展。未来,随着技术的不断创新,智能水质监测将在水资源管理中发挥更大作用。
|
6月前
|
安全 关系型数据库 MySQL
MySQL8使用物理文件恢复MyISAM表测试
MySQL8使用物理文件恢复MyISAM表测试
90 0
|
JavaScript
Vue3按钮(Button)
这是一个高度可定制的按钮组件,支持多种属性设置,包括按钮类型、形状、图标、尺寸、背景透明度、波纹颜色、跳转地址、打开方式、禁用状态、加载状态及指示符样式等。预览图展示了不同配置下的按钮样式变化。组件通过Vue实现,并提供了丰富的自定义选项以适应各种场景需求。
751 1
Vue3按钮(Button)
|
11月前
|
监控 API 微服务
后端技术演进:从单体架构到微服务的转变
随着互联网应用的快速增长和用户需求的不断演化,传统单体架构已难以满足现代软件开发的需求。本文深入探讨了后端技术在面对复杂系统挑战时的演进路径,重点分析了从单体架构向微服务架构转变的过程、原因及优势。通过对比分析,揭示了微服务架构如何提高系统的可扩展性、灵活性和维护效率,同时指出了实施微服务时面临的挑战和最佳实践。
216 7
|
11月前
|
存储 数据采集 数据库
用 Python 爬取淘宝商品价格信息时需要注意什么?
使用 Python 爬取淘宝商品价格信息时,需注意法律和道德规范,遵守法律法规和平台规定,避免非法用途。技术上,可选择 Selenium 和 Requests 库,处理反爬措施如 IP 限制、验证码识别和请求频率控制。解析页面数据时,确定数据位置并清洗格式。数据存储可选择 CSV、Excel、JSON 或数据库,定期更新并去重。还需进行错误处理和日志记录,确保爬虫稳定运行。
|
API 开发者
Vue3如何优雅的加载大量图片🚀🚀🚀
Vue3如何优雅的加载大量图片🚀🚀🚀
|
Java 数据库连接 mybatis
Mybatis之分页插件
【1月更文挑战第5天】 一、分页插件使用步骤 1、添加依赖 2、配置分页插件 二、分页插件的使用 1、开启分页功能 2、分页相关数据 方法一:直接输出 方法二使用PageInfo 常用数据:
206 1