【藍橋杯】試題 歷屆試題 剪格子(python解法+java解法)

專注的阿熊發表於2021-03-23

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章