【回溯】B050_LQ_寒假作業(全排列 / dfs + 剪枝)

一、Problem

現在小學的數學題目也不是那麼好玩的。

看看這個寒假作業:

□ + □ = □

□ - □ = □

□ × □ = □

□ ÷ □ = □

每個方塊代表1~13中的某一個數字,但不能重複。

比如:

6  + 7 = 13
9  - 8 = 1
3  * 4 = 12
10 / 2 = 5

以及: 

7  + 6 = 13
9  - 8 = 1
3  * 4 = 12
10 / 2 = 5

就算兩種解法。(加法,乘法交換律後算不同的方案)。你一共找到了多少種方案?請填寫表示方案數目的整數。

注意:你提交的應該是一個整數,不要填寫任何多餘的內容或說明性文字。

64

二、Solution

方法一:全排列

奔跑吧程序…😂

import java.util.*;
import java.math.*;
import java.io.*;
public class Main{
	static class Solution {
		int[] A = {1,2,3,4,5,6,7,8,9,10,11,12,13};
		int N = A.length, res;
		double exp = 1e-6;
		boolean[] vis;
		void init() {
			Scanner sc = new Scanner(new BufferedInputStream(System.in));
            vis = new boolean[N];
            perm(0, new int[13]);
            System.out.println(res); 
		}
		boolean check(int[] a) {
			boolean b1 = a[0] + a[1] == a[2];
			boolean b2 = a[3] - a[4] == a[5];
			boolean b3 = a[6] * a[7] == a[8];
			boolean b4 = a[11]* a[10] == a[9];
			return b1 && b2 && b3 && b4;
		}
		void perm(int k, int[] a) {
			if (k == N) { if (check(a)) res++;
				return;
			}
			for (int i = 0; i < N; i++) {
				if (i > 0 && A[i-1] == A[i] && !vis[A[i-1]])
					continue;
				a[k] = A[i];
				vis[i] = true;
				perm(k+1, a);
				vis[i] = false;
			}
		}
	}
    public static void main(String[] args) throws IOException {  
        Solution s = new Solution();
		s.init();
    }
}

複雜度分析

  • 時間複雜度:O(...)O(...)
  • 空間複雜度:O(...)O(...)

方法二:dfs

全排列太慢了,用剪枝吧…

import java.util.*;
import java.math.*;
import java.io.*;
public class Main{
	static class Solution {
		int[] A = {1,2,3,4,5,6,7,8,9,10,11,12,13};
		int N = A.length, res;
		boolean[] vis;
		double exp = 1e-6;
		void dfs(int x, int[] a) {
			if (x == 3) if (a[0] + a[1] != a[2]) return;
			if (x == 6) if (a[3] - a[4] != a[5]) return;
			if (x == 9) if (a[6] * a[7] != a[8]) return;
			if (x == 12)if (Math.abs((a[9]*1.0) / a[10] - a[11])<= exp) {
				res++;
				return;
			}
			for (int i = 0; i < N; i++) {
				if (vis[i] || i > 0 && A[i-1] == A[i] && !vis[A[i-1]])
					continue;
				a[x] = A[i];
				vis[i] = true;
				dfs(x+1, a);
				vis[i] = false;
			}
		}
		void init() {
			Scanner sc = new Scanner(new BufferedInputStream(System.in));
			vis = new boolean[N];
			dfs(0, new int[N]);
			System.out.println(res);
		}
	}
    public static void main(String[] args) throws IOException {  
        new Solution().init();
    }
}

複雜度分析

  • 時間複雜度:O(...)O(...)
  • 空間複雜度:O(...)O(...)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章