c艹样例TLE求救!!!
查看原帖
c艹样例TLE求救!!!
743373
Vitamin_B楼主2023/7/21 18:48
# include <bits/stdc++.h>

# define reg register

using namespace std;

int a[5][5], hang[5], lie[5], fang[3][3], x, y;

bool vis[20];

bool check () {

	for (reg int i = 0; i < 4; ++ i)
		if (hang[i] < 34 || lie[i] < 34)
			return 0;

	for (reg int i = 0; i < 2; ++ i)
		for (reg int j = 0; j < 2; ++ j)
			if (fang[i][j] < 34)
				return 0;

	if (a[1][1] + a[1][2] + a[2][1] + a[2][2] != 34 || a[0][0] + a[1][1] + a[2][2] + a[3][3] != 34 || a[0][3] + a[1][2] + a[2][1] + a[3][0] != 34)
		return 0;

	return 1;

}

void dfs (int x, int y) {

	if (x > 3) {
//		for (reg int i = 0; i < 4; ++ i, cout << '\n') for (reg int j = 0; j < 4; ++ j) cout << a[i][j] << ' '; cout << '\n';
		if (check ()) {

			for (reg int i = 0; i < 4; ++ i, cout << '\n')
				for (reg int j = 0; j < 4; ++ j)
					cout << a[i][j] << ' ';

			cout << '\n';

		}

		return ;

	}

	if (a[x][y] == 1)
		dfs (x + y / 3, (y + 1) & 3);
	else
		for (reg int i = 2; i < 17; ++ i)
			if (! vis[i] && i + hang[x] < 35 && i + lie[y] < 35 && i + fang[x >> 1][y >> 1] < 35) {

				vis[i] = 1;

				hang[x] += i;

				lie[y] += i;

				fang[x >> 1][y >> 1] += i;

				a[x][y] = i;

				dfs (x + y / 3, (y + 1) & 3);

				vis[i] = 0;

				hang[x] -= i;

				lie[y] -= i;

				fang[x >> 1][y >> 1] -= i;

			}

	return ;

}

int main () {

	ios::sync_with_stdio (0);

	cin.tie (0);

	cout.tie (0);

//	freopen ("magic.in", "r", stdin);
//
//	freopen ("magic.out", "w", stdout);

	cin >> x >> y;

	-- x, -- y;

	hang[x] = lie[y] = fang[x >> 1][y >> 1] = a[x][y] = 1;

	dfs (0, 0);

	return 0;

}
2023/7/21 18:48
加载中...