社区讨论

求助求助我正反字典序都85

P1985[USACO07OPEN] 翻转棋 Fliptile S参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lod6ewpg
此快照首次捕获于
2023/10/31 01:30
2 年前
此快照最后确认于
2023/11/05 11:58
2 年前
查看原帖

为啥字典序正反我都WA 3 4啊好气哦

CPP
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int MAX_LEN = 15;

int n, m, ans, cnt;
bool Squ[MAX_LEN + 2][MAX_LEN + 2], Fliped[MAX_LEN][MAX_LEN], solved;
inline void Flip(int i, int j) {
	Squ[i][j] = !Squ[i][j];
	Squ[i + 1][j] = !Squ[i + 1][j];
	Squ[i - 1][j] = !Squ[i - 1][j];
	Squ[i][j + 1] = !Squ[i][j + 1];
	Squ[i][j - 1] = !Squ[i][j - 1];
	return;
}
inline int Min(int a, int b) {
	return a < b ? a : b;
}

void Check(int k) {
	int tmp = k;
	memset(Fliped, false, sizeof(Fliped));
	int cnt1 = 0;
	for (int j = 1; j <= m; j++, k >>= 1) {
		if (k & 1) {
			Fliped[1][m - j + 1] = true;
			Flip(1, m - j + 1);
			cnt1++;
		}
	}
	for (int i = 2; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (Squ[i - 1][j]) {
				Fliped[i][j] = true;
				Flip(i, j);
				cnt1++;
			}
		}
	}
	bool flag = true;
	for (int j = 1; j <= m; j++) {
		if (Squ[n][j]) {
			flag = false;
		}
	}
	if (flag && cnt1 < cnt) {
		ans = tmp, cnt = cnt1, solved = true;
		//cout << cnt1 << endl;
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (Fliped[i][j]) {
				Flip(i, j);
				Fliped[i][j] = false;
			}
		}
	}
	return;
}
void Output(int k) {
	for (int j = 1; j <= m; j++, k >>= 1) {
		if (k & 1) {
			Fliped[1][m - j + 1] = true;
			Flip(1, m - j + 1);
		}
	}
	for (int i = 2; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (Squ[i - 1][j]) {
				Fliped[i][j] = true;
				Flip(i, j);
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cout << Fliped[i][j];
			if (j < m) {
				cout << ' ';
			}
		}
		if (i < n) {
			cout << endl;
		}
	}
	return;
}

int main() {
	solved = false;
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> Squ[i][j];
		}
	}
	cnt = n * m + 1;
	for (int k = 0; k < (1 << m); k++) {
		Check(k);
	}
	if (cnt < n * m + 1) {
		Output(ans);
	}
	else {
		cout << "IMPOSSIBLE" << endl;
	}
	return 0;
}
求DALAO帮帮忙看看我这代码哪里错了啊

回复

3 条回复,欢迎继续交流。

正在加载回复...