DFS只过了前三个点
查看原帖
DFS只过了前三个点
816549
52wyd楼主2023/5/5 12:53
#include <cstdio>
#include <iostream>
#include <algorithm>

#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'
#define int long long

using namespace std;

const int N = 2e5 + 10;

int ext[10]; // 标记这个数字是否能用
int n, a[20];
int cnt; // 答案的个数

/*
      a1  a2  a3
  ×       a4  a5
  ----------------
      a6  a7  a8
  a9  a10 a11
  ----------------
  a12 a13 a14 a15
 */

void dfs(int start) { // 深搜a[1] ~ a[5]
	if (start == 6) {
		a[8] = a[3] * a[5];
		a[7] = a[2] * a[5]; 
		a[6] = a[1] * a[5];
		if (a[8] > 9) { // 判断是否需要进位
			a[8] -= 10;
			a[7] ++;
		}
		if (a[7] > 9) { // 判断是否需要进位
			a[7] -= 10;
			a[6] ++;
		}
		if (a[6] > 9) 
			return;
		a[11] = a[3] * a[4];
		a[10] = a[2] * a[4]; 
		a[9] = a[1] * a[4]; 
		if (a[11] > 9) { // 判断是否需要进位
			a[11] -= 10;
			a[10] ++;
		}
		if (a[10] > 9) { // 判断是否需要进位
			a[10] -= 10;
			a[9] ++;
		}
		if (a[9] > 9) 
			return;
		a[15] = a[8];
		a[14] = a[7] + a[11];
		a[13] = a[6] + a[10];
		a[12] = a[9]; 
		if (a[15] > 9) { // 判断是否需要进位
			a[15] -= 10;
			a[14] ++;
		}
		if (a[14] > 9) { // 判断是否需要进位
			a[14] -= 10;
			a[13] --;
		}
		if (a[13] > 9) { // 判断是否需要进位
			a[13] -= 10;
			a[12] ++;
		}
		if (a[12] > 9)
			return;
		int ok = 1;
		for (int i = 6; i <= 15; i ++) // 判断是否出现了不能用的数字
			if (!ext[a[i]])
				ok = 0;
		if (ok) {
			cnt ++;
		}
		return;
	}
	for (int i = 1; i <= 9; i ++) {
		if (ext[i]) {
			a[start] = i;
			dfs(start + 1);
		}
	}
}

signed main() {
	IOS;
	
	cin >> n;
	for (int i = 1; i <= n; i ++) {
		int x; cin >> x;
		ext[x] = 1;
	}
	
	dfs(1);
	
	cout << cnt << endl;
	return 0;
}


2023/5/5 12:53
加载中...