【藍橋杯】試題 歷屆試題 剪格子(python解法+java解法)
python 解法:
# 100 分
def dfs(x, y, sum1, num):
global count # 不定義全域性變數,函式里面的變數不影響外邊,而且函式不能呼叫外邊的變數,相當於兩個變數了。
global flag # 在函式外邊宣告的變數,在函式里邊是不能直接用的,正如上面所說,他們屬於兩個不同的變數了。
if sum1==sum2:
count=num
flag=True
return
if sum1>sum2:
return
used[x][y]=1 # 列表可以直接在函式內部改變外部的全域性變數
# 如果現在不是最後一行,那麼可以往下走
if x+1<n and used[x+1][y]==0:
dfs(x+1,y,sum1+list1[x][y],num+1)
# 如果現在不是最頂上的一行,那麼可以往上走
if x-1>=0 and used[x-1][y]==0:
dfs(x-1,y,sum1+list1[x][y],num+1)
# 如果現在不是最右邊的一列,那麼可以往右邊走
if y+1<m and used[x][y+1]==0:
dfs(x,y+1,sum1+list1[x][y],num+1)
# 如果現在不是最左邊的一列,那麼可以往左邊走
if y-1>=0 and used[x][y-1]==0:
dfs(x,y-1,sum1+list1[x][y],num+1)
# 外匯跟單gendan5.com 執行到這說明 s[i][j] 這個數字不行,還原為未使用狀態
used[x][y]=0 # 搜尋失敗,回溯,將訪問記錄清零
m,n=map(eval,input().split())
list1=[]
for i in range(n):
list1.append((list(map(eval,input().split()))))
# 標記每個格子的使用情況: 0- 未使用; 1- 已使用
used=[[0 for i in range(m)] for j in range(n)]
sum1=0
sum2=0
for i in range(n):
for j in range(m):
sum2+=list1[i][j]
sum2/=2
count=0
flag=False
dfs(0, 0, 0, 0)
if flag:
print(count)
else:
print(0)
java 解法:
// 100 分
import java.util.Scanner;
public class Main {
private static int m,n;
private static String[] str;
private static int[][] arr1; // 輸入陣列
private static int[][] used; // 每個陣列元素是否被使用
private static int sum1=0; // 所有格子中數字的總和
private static int count=0; // 包含左上角的分割區可能包含的最小的格子數目
private static boolean isFlag=false;
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
m= scan.nextInt();
n= scan.nextInt();
/*
m 、 n 在一行輸入,
例:4 3 ;
在兩行輸入,
例:
4
3
都可以被讀取
*/
arr1=new int[n][m]; // 一定不能忘記初始化,否則報錯
scan.nextLine();
for(int i=0;i<n;i++){
str=scan.nextLine().split(" ");
for(int j=0;j<m;j++){
arr1[i][j]=Integer.parseInt(str[j]);
sum1+=arr1[i][j];
}
}
// System.out.println(Arrays.deepToString(arr1));
used=new int[n][m]; // 一定不能忘記初始化,否則報錯
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
used[i][j]=0;
}
}
// used[0][0]=1;
dfs(0,0,0,0);
if(isFlag){
System.out.println(count);
}else{
System.out.println(0);
}
}
public static void dfs(int x,int y,int sum2,int num){
// System.out.println(sum2);
if(sum2==sum1/2){
// System.out.println("qq");
isFlag=true;
count=num;
return;
}
if(sum2>sum1/2){
return;
}
used[x][y]=1;
if(x-1>=0 && used[x-1][y]==0){
dfs(x-1,y,sum2+arr1[x][y],num+1);
}
if(x+1<n && used[x+1][y]==0){
dfs(x+1,y,sum2+arr1[x][y],num+1);
}
if(y-1>=0 && used[x][y-1]==0){
dfs(x,y-1,sum2+arr1[x][y],num+1);
}
if(y+1<m && used[x][y+1]==0){
dfs(x,y+1,sum2+arr1[x][y],num+1);
}
used[x][y]=0; // 搜尋失敗,回溯,將訪問記錄清零
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2764518/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 歷屆試題 矩陣翻硬幣 (藍橋杯)矩陣
- 藍橋杯歷年(省賽)試題彙總及試題詳解
- 藍橋杯 2014屆真題 地宮取寶 動態規劃解法動態規劃
- 【藍橋杯考前突擊】第十屆藍橋杯省賽C/C++大學B組 試題 D 數的分解C++
- 2013年第四屆藍橋杯省賽試題及詳解(Java本科C組)Java
- 2018年第九屆藍橋杯省賽試題及詳解(Java本科A組)Java
- 藍橋杯練習試題程式碼及講解
- 藍橋杯真題
- 2014年第五屆藍橋杯省賽試題及詳解(Java本科C組)Java
- 2018年第九屆藍橋杯省賽試題及詳解(Java本科B組)Java
- 藍橋杯試題 基礎練習 特殊迴文數
- Java藍橋杯14年第五題Java
- 藍橋杯-座次問題
- 藍橋杯-日期問題
- 第十四屆藍橋杯省賽C++ B組(個人經歷 + 題解)C++
- 2024年第十五屆藍橋杯軟體類國賽 C/C++ B組 個人解法C++
- 試題B:小球反彈(第十五屆藍橋杯省賽B組c/c++組)C++
- 四人過橋問題的SQL解法SQL
- 太陽(藍橋杯14屆)
- 八皇后問題python解法Python
- 藍橋杯2023年A組-試題A-幸運數
- 第十屆藍橋杯C語言大學B組C/C++ 試題F:特別的數C語言C++
- 歷屆藍橋杯省賽(C、C++)的答案(轉)C++
- topK問題解法TopK
- 第九屆藍橋杯軟體類省賽 Java B組 題目及解析Java
- 藍橋杯2023年A組-試題D-平方差
- 2018第九屆藍橋杯省賽C++B組【第四題:測試次數】C++
- 藍橋杯例題-快速分揀
- 10元買啤酒問題Java解法Java
- 第十屆藍橋杯C++國賽B組部分題解(假題解)C++
- 藍橋杯 演算法訓練 操作格子 (線段樹)演算法
- 藍橋杯2023年A組-試題B-有獎問答
- 藍橋杯2023年A組-試題E-顏色平衡樹
- 第九屆藍橋杯省賽C++A組 倍數問題(dfs)C++
- 歷屆試題 數字遊戲(數學)遊戲
- 藍橋杯-遞增三元組(三種解法,二分, 雙指標, 字首和)指標
- 2019年省賽第十屆藍橋杯B組C/C++試題H解 等差數列C++
- 第十三屆藍橋杯省賽A組