RE 求调(非正解)
查看原帖
RE 求调(非正解)
820574
yonghu_3913楼主2024/9/16 17:13

暴力枚举每一种可能性

虽然正解是状压,但是爆搜至少不应该RE吧

#include<bits/stdc++.h>
using namespace std;
int n; 
int a[100][100];
int ans = 1e9;
char c[100];
bool dfs(int step,int cnt){
	if(step > 6) return 0;
//	cout << step << " " << cnt << '\n';
//	for(int i = 1;i <= 5;i++){
//		for(int j = 1;j <= 5;j++){
//			cout << a[i][j] << " ";
//		}
//		cout << '\n';
//	}
//	puts("A");
	if(cnt >= 25){
		ans = min(ans,step);
		return 1;
	}
//	int flag = 0;
//	for(int i = 1;i <= 5;i++){
//		for(int j = 1;j <= 5;j++){
//			cout << a[i][j] << " ";
//			flag += a[i][j];
//		}
//		cout << '\n';
//	}
//	cout << cnt << "\n____________\n";
//	if(flag == 25){
//		ans = min(ans,step);
//		return 1;
//	}
	if(step > 6) return 0;
	for(int i = 1;i <= 5;i++){
		for(int j = 1;j <= 5;j++){
			if(a[i][j]) continue;
			if(!a[i][j]){
				a[i][j] ^= 1;
				if(i == 1){
					if(j == 1){
						int delta = 0;
						delta += ((!a[i + 1][j]) + (!a[i][j + 1]));
						a[i + 1][j] ^= 1;
						a[i][j + 1] ^= 1;
						dfs(step + 1,cnt + delta + 1 - (2 - delta));
						a[i + 1][j] ^= 1;
						a[i][j + 1] ^= 1;
					}else if(j == 5){
						int delta = 0;
						delta += ((!a[i + 1][j]) + (!a[i][j - 1]));
						a[i + 1][j] ^= 1;
						a[i][j - 1] ^= 1;
						dfs(step + 1,cnt + delta + 1);
						a[i + 1][j] ^= 1;
						a[i][j - 1] ^= 1;
					}else{
						int delta = 0;
						delta += ((!a[i][j - 1]) + (!a[i][j + 1]) + (!a[i + 1][j]));
						a[i][j - 1] ^= 1;
						a[i][j + 1] ^= 1;
						a[i + 1][j] ^= 1;
						dfs(step + 1,cnt + delta + 1 - (3 - delta));
						a[i][j - 1] ^= 1;
						a[i][j + 1] ^= 1;
						a[i + 1][j] ^= 1;
					}
				}else if(i == 5){
					if(j == 1){
						int delta = 0;
						delta += ((!a[i - 1][j]) + (!a[i][j + 1]));
						a[i - 1][j] ^= 1;
						a[i][j + 1] ^= 1;
						dfs(step + 1,cnt + delta + 1 - (2 - delta));
						a[i][j + 1] ^= 1;
						a[i - 1][j] ^= 1;
					}else if(j == 5){
						int delta = 0;
						delta += ((!a[i][j - 1]) + (!a[i - 1][j]));
						a[i][j - 1] ^= 1;
						a[i - 1][j] ^= 1;
						dfs(step + 1,cnt + delta + 1 - (2 - delta));
						a[i][j - 1] ^= 1;
						a[i - 1][j] ^= 1;
					}else{
						int delta = 0;
						delta += ((!a[i][j - 1]) + (!a[i][j + 1]) + (!a[i - 1][j]));
						a[i][j - 1] ^= 1;
						a[i][j + 1] ^= 1;
						a[i - 1][j] ^= 1;
						dfs(step + 1,cnt + delta + 1 - (3 - delta));
						a[i][j - 1] ^= 1;
						a[i][j + 1] ^= 1;
						a[i - 1][j] ^= 1;
					}
				}else{
					if(j == 1){
						int delta = 0;
						delta += ((!a[i - 1][j]) + (!a[i + 1][j]) + (!a[i][j + 1]));
						a[i - 1][j] ^= 1;
						a[i + 1][j] ^= 1;
						a[i][j + 1] ^= 1;
						dfs(step + 1,cnt + delta + 1 - (3 - delta));
						a[i - 1][j] ^= 1;
						a[i + 1][j] ^= 1;
						a[i][j + 1] ^= 1;
					}else if(j == 5){
						int delta = 0;
						delta += ((!a[i - 1][j]) + (!a[i + 1][j]) + (!a[i][j - 1]));
						a[i - 1][j] ^= 1;
						a[i + 1][j] ^= 1;
						a[i][j - 1] ^= 1;
						dfs(step + 1,cnt + delta + 1 - (3 - delta));
						a[i - 1][j] ^= 1;
						a[i + 1][j] ^= 1;
						a[i][j - 1] ^= 1;
					}else{
						int delta = 0;
						delta += ((!a[i - 1][j]) + (!a[i + 1][j]) + (!a[i][j - 1]) + (!a[i][j + 1]));
						a[i - 1][j] ^= 1;
						a[i + 1][j] ^= 1;
						a[i][j - 1] ^= 1;
						a[i][j + 1] ^= 1;
						dfs(step + 1,cnt + delta + 1 - (4 - delta));
						a[i - 1][j] ^= 1;
						a[i + 1][j] ^= 1;
						a[i][j - 1] ^= 1;
						a[i][j + 1] ^= 1;
					}
				}
				a[i][j] ^= 1;
			}
		}
	}
}
int main(){
//	ios::sync_with_stdio(false);
//	cin.tie(nullptr),cout.tie(nullptr);
	cin >> n;
	while(n--){
		ans = 1e9;
		int cnt = 0;
		for(int i = 1;i <= 5;i++){
			cin >> c;
			for(int j = 1;j <= 5;j++){
				a[i][j] = c[j - 1] - '0';
				cnt += a[i][j];
			}
		}
//		getchar();
//		for(int i = 1;i <= 5;i++){
//			for(int j = 1;j <= 5;j++){
//				cout << a[i][j]; 
//				if(j != 5) cout << "-";
//			}
//			cout << '\n';
//		}
//		int line;cin >> line;
		bool can = dfs(0,cnt);
		if(can && ans != (int)1e9) cout << ans << '\n';
		else cout << "-1"; 
	}
} 
2024/9/16 17:13
加载中...