蓝桥杯java第七届决赛第四题--路径之谜
生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯java第七届决赛第四题--路径之谜
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
路徑之謎小明冒充X星球的騎士,進入了一個奇怪的城堡。城堡里邊什么都沒有,只有方形石頭鋪成的地面。假設城堡地面是 n x n 個方格。【如圖1.png】所示。按習俗,騎士要從西北角走到東南角。可以橫向或縱向移動,但不能斜著走,也不能跳躍。每走到一個新方格,就要向正北方和正西方各射一箭。(城堡的西墻和北墻內各有 n 個靶子)同一個方格只允許經過一次。但不必做完所有的方格。如果只給出靶子上箭的數目,你能推斷出騎士的行走路線嗎?有時是可以的,比如圖1.png中的例子。本題的要求就是已知箭靶數字,求騎士的行走路徑(測試數據保證路徑唯一)輸入:第一行一個整數N(0<N<20),表示地面有 N x N 個方格第二行N個整數,空格分開,表示北邊的箭靶上的數字(自西向東)第三行N個整數,空格分開,表示西邊的箭靶上的數字(自北向南)輸出:一行若干個整數,表示騎士路徑。為了方便表示,我們約定每個小格子用一個數字代表,從西北角開始編號: 0,1,2,3....比如,圖1.png中的方塊編號為:0 1 2 34 5 6 78 9 10 1112 13 14 15示例:用戶輸入:42 4 3 44 3 3 3程序應該輸出:0 4 5 1 2 3 7 11 10 9 13 14 15資源約定:峰值內存消耗 < 256MCPU消耗 < 1000ms請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。注意:主類的名字必須是:Main,否則按無效代碼處理。
package com.sihai.qijie;import java.util.Scanner;
public class _4{static int[] row ;//保存北邊靶子上的數目static int[] col; //保存西邊靶子的數目static int[][] vis ; // 標記數組,標記迷宮的方格是否走過static int N; //上下左右四個方向static int[][] location = {{0,1},{1,0},{0,-1},{-1,0}};//轉換成0--N^2-1的數組,輸出要求 static int[][] print;static int rowSum = 0;//北邊靶子的總數目static int colSum = 0;//西邊靶子的總數目static int[] map = null; //滿足要求的行走路徑static int aLen =1; //可行路徑的長度public static void main(String[] args){Scanner sc = new Scanner(System.in);N = sc.nextInt();//初始化數據row = new int[N];col = new int[N];vis = new int[N][N];print = new int[N][N];map = new int[N*N+1];int index = 0;for(int i=0; i<N; ++i)for(int j=0; j<N; ++j)print[i][j] = index++;//輸入數據for(int i=0; i<N; ++i){row[i] = sc.nextInt();rowSum += row[i];}for(int i=0; i<N; ++i){col[i] = sc.nextInt();colSum += col[i];}//開始計算row[0]--;rowSum--;col[0]--;colSum--;vis[0][0] = 1;map[0] = 0;//從0,0出發dfs(0,0);}public static void dfs(int x, int y){if(x==N-1 && y==N-1){//打印結果if(rowSum==0 && colSum==0){for(int i=0; i<aLen; ++i)System.out.print(map[i]+" ");}}for(int i=0; i<4; ++i){int dx = x + location[i][0];int dy = y + location[i][1];//1.沒出界,2.行列上的靶子數目至少為1if (dx >= 0 && dx < N && dy >= 0 && dy < N && vis[dx][dy] == 0 && row[dy] > 0 && col[dx] > 0) {vis[dx][dy] = 1;row[dy]--;rowSum--;col[dx]--;colSum--;map[aLen++] = print[dx][dy];dfs(dx, dy);aLen--; //走不通,直接將map數組的aLen--vis[dx][dy] = 0;row[dy]++;rowSum++;col[dx]++;colSum++;}}}
}
總結
以上是生活随笔為你收集整理的蓝桥杯java第七届决赛第四题--路径之谜的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝桥杯java第七届决赛第三题--打靶
- 下一篇: 蓝桥杯java第六届决赛第一题--分机号