1303: [藍橋杯2016決賽]路徑之謎
題目
思路:感覺就是簡單的dfs,需要一直考慮到回溯,最後還要剪枝,不然會出現超時的問題
AC程式碼:
package 藍橋杯2016;
import java.util.*;
public class 路徑之謎 {
static Scanner sc=new Scanner (System.in);
static int X[],Y[];
static int b[][];//判斷路徑之前是否走過
static int n;
static int next[][]= {{1,0},{-1,0},{0,1},{0,-1}};
public static void main(String[] args) {
n=sc.nextInt();
X=new int [n+1];
Y=new int [n+1];
b=new int[n+1][n+1];
for(int i=1;i<=n;i++)Y[i]=sc.nextInt();
for(int j=1;j<=n;j++)X[j]=sc.nextInt();
dfs(1,1,1);
}
private static void dfs(int x,int y,int s) {//引數為當前位置
if(x<=0||y<=0||x>n||y>n)return;//越界
if(b[x][y]!=0)return;//已經走過
for(int i=1;i<n;i++) if(X[i]<0||Y[i]<0)return;//剪枝,已經出現負,該情況不存在
X[x]--;
Y[y]--;
b[x][y]=s;
s++;
if(x==n&&y==n) {
for(int i=1;i<=n;i++) {
if(X[i]!=0||Y[i]!=0) {
X[x]++;
Y[y]++;
b[x][y]=0;
return;
}
}
int a[]=new int [s];
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)a[b[i][j]]=(i-1)*n+j-1;
StringBuilder ss=new StringBuilder();
for(int i=1;i<s;i++) ss.append(a[i]+" ");
System.out.println(ss);
}else for(int i=0;i<4;i++)dfs(x+next[i][0],y+next[i][1],s);
X[x]++;//回溯
Y[y]++;
b[x][y]=0;
}
}
相關文章
- 2016藍橋杯省賽第七題剪郵票
- [藍橋杯2018決賽]最大乘積
- 藍橋杯2015決賽]四階幻方
- 藍橋杯javaB組備賽Java
- 2016年藍橋杯C/C++組省賽第三題--湊算式C++
- 2016年藍橋杯C/C++組省賽第四題--快速排序C++排序
- 2018藍橋杯省賽B組
- 2017省賽藍橋杯B組
- 藍橋杯大賽——驅動程式
- 藍橋杯2015初賽生命之樹 DFS圖解圖解
- 2016年藍橋杯C/C++組省賽第一題--煤球數目C++
- 2016年藍橋杯C/C++組省賽第二題--生日蠟燭C++
- 藍橋杯學習路線
- 第十五屆藍橋杯 網路安全賽道 ezjavaJava
- 藍橋杯
- [藍橋杯][2016年第七屆真題]冰雹數
- 24藍橋杯-網路安全組
- 第14屆藍橋杯B組國賽
- 藍橋杯第9場小白入門賽
- 第十三屆藍橋杯省賽A組
- 藍橋杯省賽真題2013題解
- 2020藍橋杯競賽複習指導
- 【計蒜客】2017藍橋杯模擬賽(四)
- 藍橋杯嵌入式之點燈
- 藍橋杯 買瓜
- 藍橋杯-分巧克力
- 藍橋杯-N皇后
- 藍橋杯真題
- 藍橋杯 剪格子
- 藍橋杯-AB路線(詳細原創)
- 【藍橋杯考前突擊】第十一屆藍橋杯校賽模擬C/C++ 正整數序列C++
- 第六屆藍橋杯省賽CC++B組C++
- 藍橋杯之帶分數(全排列+暴力)
- 藍橋杯真題之錯誤票據
- 2016年省賽第七屆藍橋杯B組C/C++第九題解 交換瓶子C++
- 藍橋杯-長草(BFS)
- 藍橋杯-螞蟻感冒
- 藍橋杯-帶分數