程序设计大赛---骑士巡游

2024-01-10 14:32

本文主要是介绍程序设计大赛---骑士巡游,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 给定一个8*8的国际象棋棋盘,在这64个格子中指定一个起点和一个终点,求“马”从起点跳到终点所需的最少次数.

输入:

       输入文件包含多组测试数据,每组数据占一行,包含起点和终点的两个坐标,坐标格式如下:首先是一个字母(a~h)表示所在的列,紧跟着是一个数字(1~8)表示所在的行,两个坐标第一个表示起点,第二个表示终点,中间用一个空格隔开。

输出:

       对于输入文件中每一组数据块,输出一个整数表示从起点到终点要跳的最少次数,每个输出占一行。

输入样本:

e2 e4
a1 b2
b2 c3
a1 h8
a1 h7
h8 a1
b1 c3
f6 f6

输出样本:

2
4
2
6
5
6
1
0

我的程序:

#include<iostream.h>
#include<stdio.h>

int first_en=1;     //判断是否是第一次

//写文件
void mywrite(int count,int first)
{
    FILE *pt;
    pt=fopen("output.txt","a");
    if(first==1)
        fprintf(pt,"%d",count);
    else
        fprintf(pt,"/n%d",count);
    fclose(pt);
}
//清空文件
void clearfile()
{
    FILE *pt;
    pt=fopen("output.txt","w");
    fclose(pt);
}
//回溯算法

void knight(int a[][8],int dir[][2],int n1,int m1,int n2,int m2,int count,int min,int o1,int o2)
{
    if(min>count && a[o1][o2]!=0)
    {
        int i,j;
        int nn,mm;
        if(n1==n2 && m1==m2)   //是否结束
        {
            mywrite(count,first_en);
            first_en=0;        //将第一次标志变为0
            min=count;
            for(i=0;i<8;i++)
            {
                for(j=0;j<8;j++)
                    a[i][j]=0;
            }
        }
        else
        {
            for(i=0;i<8;i++)
            {
                if(min<count)
                    break;
                else
                {
                    nn=n1+dir[i][0];
                    mm=m1+dir[i][1];
                    if(nn>=0 && nn<=7 && mm>=0 && mm<=7 && a[nn][mm]==0 && a[o1][o2]!=0)
                    {
                        a[nn][mm]=1;
                        knight(a,dir,nn,mm,n2,m2,count+1,min,o1,o2);
                        a[nn][mm]=0;
                    }
                }
            }
        }
    }
}


void main()
{
    int a[8][8];
    clearfile();
    FILE *pt;
    char str1[2],str2[2];
    int i,j,min;
    int o1,o2;
    int o3,o4;
    for(i=0;i<8;i++)
    {
        for(j=0;j<8;j++)
            a[i][j]=0;
    }
    if(NULL==(pt=fopen("input.txt","r")))
    {
        cout<<"can't open input.txt!"<<endl;
    }
    else
    {
        while(fscanf(pt,"%s",str1)!=EOF)
        {
            fscanf(pt,"%s",str2);
            o1=str1[0]-'a';
            o2=str1[1]-'0'-1;
            o3=str2[0]-'a';
            o4=str2[1]-'0'-1;
            a[o1][o2]=1;
            int dir[8][2]={{-2,-1},{-1,-2},{1,-2},{2,-1},{2,1},{1,2},{-1,2},{-2,1}};
            for(min=1;min<64;min++)
            {
                if(a[o1][o2]==0)
                    break;
                else
                    knight(a,dir,o1,o2,o3,o4,0,min,o1,o2);
            }
        }
       
        fclose(pt);
    }
}

输入:

e3 e4
a2 h8

输出:

3
5

 

这篇关于程序设计大赛---骑士巡游的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/591120

相关文章

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

MapReduce程序设计2

要求 1、数据集stock-daily,包含A股近4000只股票的今年以来的日数据;数据集stock-daily-30d仅包含最近30个交易日数据,根据自己计算机性能选择。 数据来源:https://www.joinquant.com/help/api/help?name=JQData 2、数据集stock-concept,包含A股近4000只股票所有的股票代码、名称和概念。 数据来源:万

java 程序设计 第九章对象和类

目录 9.1 引言 9.2 为对象定义类 9.3 示例:创建类和定义对象 9.4 使用构造方法构造对象 9.5 通过引用变量访问变量 9.6 使用Java中的类 9.7 静态变量、常量和方法 9.8 可见性修饰符  9.9 数据域封装 9.10 向方法传递对象参数 9.11 对象数组 9.12 不可变对象和类 9.13 变量的作用域 9.14 this引用 9.1

Windows程序设计课程作业-3(文件并发下载)

目录 目录 1.作业内容 2.作业要求 3.主要思路  1)窗体和组件初始化  2)下载管理器实例化 3)按钮点击事件处理 4)窗体加载事件处理  5)下载消息处理  4.主要难点 1)多线程管理: 2) UI更新: 3) 错误处理: 4) 资源管理: 5) 用户体验: 5.不足及改进 参考:  6.代码展示 代码仓库  7.运行结果 ​​​​​ 1.

C#实现音乐在线播放和下载——Windows程序设计作业3

1. 作业内容     编写一个C#程序,在作业二实现的本地播放功能的基础上,新增在线播放和在线下载功能,作业二博客地址:C#实现简单音乐文件解析播放——Windows程序设计作业2 2. 架构选择     考虑到需求中的界面友好和跨版本兼容性,我选择选择WinForms作为开发平台,WinForms提供了一个简单而强大的方法来创建桌面应用程序,并且与C#高度兼容,在开发过程,选择.NETF

2024年全国青少信息素养大赛python编程复赛集训第八天编程题分享

整理资料解析答案非常不容易,感谢各位大佬给个点赞和分享吧,谢谢 今天题目较难:适合初中组 大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训题目 (一)比赛内容:  【小学组】  1.了解输入与输出的概念,掌握使用基本输入输出和简单运算 为主的标准函数; 2.掌握注释的方法; 3.掌握基本数据类型(字符串、数值、逻辑型)的概念以及表示 方法; 掌握数值

利用网站资讯监控工具实时监控炒股大赛选手购买股票

这次教大家利用《网站资讯监控工具》实时监控网易炒股大赛选手购买股票详情。 先给大家看看使用的软件以及要监控的界面: 我们需要监控股票持仓区域的变化,然后让软件报警,而浮动盈亏,盈亏比例这些会实时变化,而我们又不用知道这些变化,所以,我们先要设置软件自动忽略数字变化。 首先先打开软件上方的设置选项,选择数据采集方案。 因为股票持仓区域为表格,所

java程序设计 第八章 多维数组

8.1 引言 二维数组可以将一维数组作为元素的数组 8.2  二维数组基础        声明二维数组:elementType[ ][ ] arrayRefVar                         例如:int[ ][ ] matrix; 创建二维数组:matrix = new int[5][5] 数组初始化简明语句: int[ ][ ] array = { {1

【2023年全国青少年信息素养大赛智能算法挑战赛复赛真题卷】

目录 2023全国青少年信息素养大赛智能算法挑战赛初中组复赛真题 2023全国⻘少年信息素养⼤赛智能算法挑战复赛⼩学组真题 2023全国青少年信息素养大赛智能算法挑战赛初中组复赛真题 1. 修复机器人的对话词库错误 【题目描述】 基于人工智能技术的智能陪伴机器人的语言词库被黑客的病毒感染了,感染方 式是在单词中的某个字母被增加了两次,例如“hello”变成了

Java程序设计 第七章 一维数组

目录 7.2 数组基础 7.3 示例学习:分析数字 7.5复制数组 7.6 将数组传递给方法 7.7 方法返回数组 7.9 可变长参数列表 7.10 查找数组 7.11 数组排序(直接排序) 略 7.12 Arrays类 7.13 命令行参数 7.2 数组基础   声明数组:elementType[]  arrayRefVar;                 例