首先,理解題意是十分重要的,我們是要求最短路徑,這道題可以用dfs,但是題目給出的數據是有規律的,我們可以嘗試模擬的過程使用簡單的方法做出來。每隔w數字就會向下轉向,就比如題目上示例的w=6,無論從任何一個點出發,到6的倍數就會向下走,走6步繼續向下走,我們可以使用兩個變量記錄,向下走的步數就是兩個房子在列上的距離,行之間的距離需要進行處理,因為每兩行是不同的,一行正增長,一行負增長,如果向下轉向的次數是2的倍數說明又回到了相同的遞增/遞減規律行上,只需要取x1-x2的絕對值,x1即原坐標所在的行,x2即終點坐標所在的行;如果是轉向奇數次,則說明一行正增長,一行負增長,取余之后的值一個是從左數到右,一個是從右數到左,我們直接給第一個數字加上6得到了下一個數字的位置,就變成了偶數行,再取相減的絕對值即可!
①接收數據
②模擬過程,存儲轉向數據
③判斷轉向次數,若為偶數直接取行位置相減的絕對值即可
④若不為偶數,給第一個數字+w再取相減的絕對值
⑤輸出結果
代碼如下👇
public static void main(String[] args) {Scanner scan = new Scanner(System.in);int w=scan.nextInt();int start=scan.nextInt();int end=scan.nextInt();int count=0;int x1=start%w;//距離行起點相對位置int x2=end%w;//距離行起點相對位置for (int i = start; i <= end; i++) {if (i%w==0) {//轉向count++;}}//System.out.println(count);測試點if (count%2==0) {//兩行同方向System.out.println(count+Math.abs(x1-x2));}else {//兩個方向不同int x3=Math.abs(end-((count+1)*w-start+1));//System.out.println(x3);System.out.println(count+x3);}scan.close();}