题解 CF3A 【Shortest path of the king】
本题本人思路如下:
- 定义字符
a1,b1 ,分别代表起点和终点的横坐标,然后定义数字a2,b2 ,分别代表起点和终点的纵坐标 - 把棋盘以起点作为原点,分为四个部分,代表终点在起点的哪个方向,(左下,右下,左上,右上),分别处理。 (在代码中分别是work1,work2,work3,work4)
- 使用while,只要棋子的横坐标和纵坐标与终点不同,就不停止运动。如果棋子横坐标和纵坐标都不与终点相同,就同时移动两个方向(斜着走),如果横坐标和纵坐标只有一个相同,就只移动一个方向。
-
在移动时,用字符数组把走的方向记录下来,定义
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; }
结束。