题解 CF3A 【Shortest path of the king】

· · 题解

本题本人思路如下:

  1. 定义字符 a1,b1,分别代表起点和终点的横坐标,然后定义数字 a2,b2,分别代表起点和终点的纵坐标
  2. 把棋盘以起点作为原点,分为四个部分,代表终点在起点的哪个方向,(左下,右下,左上,右上),分别处理。 (在代码中分别是work1,work2,work3,work4)
  3. 使用while,只要棋子的横坐标和纵坐标与终点不同,就不停止运动。如果棋子横坐标和纵坐标都不与终点相同,就同时移动两个方向(斜着走),如果横坐标和纵坐标只有一个相同,就只移动一个方向。
  4. 在移动时,用字符数组把走的方向记录下来,定义 top 为走的步数。
    下面附上代码

    
    #include<bits/stdc++.h>
    using namespace std;
    char ai,bi;
    int aj,bj;//定义横纵坐标
    string s[100];//字符串数组
    int top=0;//走的步数
    void work1()//这里处理的是往左下的方向走
    {
    
    while((ai!=bi)||(aj!=bj))
    {
        if(ai!=bi&&aj!=bj) //如果纵横坐标都不一样,那就斜着走,记录为 ‘LD’   
        {
            ai--;
            aj--;
            s[++top]="LD";
        }
        else
        if(ai!=bi)  ai--,s[++top]="L";//否则如果横坐标不一样,横着走,像左移动并记录
        else aj--,s[++top]="D";//如果纵坐标不一样就竖着走,像下移动并记录
    
    }
    }
    void work2()//同work1,处理向右下走
    {
    while(ai!=bi||aj!=bj)
    {
        if(ai!=bi&&aj!=bj) 
        {
            ai++;
            aj--;
            s[++top]="RD";
        }
        else
        if(ai!=bi)  ai++,s[++top]="R";
        else aj--,s[++top]="D";
    
    }
    }
    void work3()//同work1,向左上走
    {
    while(ai!=bi||aj!=bj)
    {
        if(ai!=bi&&aj!=bj) 
        {
            ai--;
            aj++;
            s[++top]="LU";
        }
        else
        if(ai!=bi)  ai--,s[++top]="L";
        else aj++,s[++top]="U";
    
    }
    }
    void work4()//同work1,向右上走
    {
    while(ai!=bi||aj!=bj)
    {
        if(ai!=bi&&aj!=bj) 
        {
            ai++;
            aj++;
            s[++top]="RU";
        }
        else
        if(ai!=bi)  ai++,s[++top]="R";
        else aj++,s[++top]="U";
    
    }
    }
    int main()
    {
    cin>>ai>>aj;
    cin>>bi>>bj;//输入
    if((ai>=bi)&&(aj>=bj)) work1();
    else if(ai<=bi&&aj>=bj) work2();
    else if(ai>=bi&&aj<=bj) work3();
    else work4();//判断终点在起点哪个方向
    cout<<top<<endl;//输出步数
    for(int i=1;i<=top;i++)
    cout<<s[i]<<endl;//输出记录的方向
    return 0;
    }

结束。