萌新刚学 OI,求助一道水题 qwq
查看原帖
萌新刚学 OI,求助一道水题 qwq
298549
SIXIANG32楼主2023/3/25 16:49

如题,真的是水题,但是写炸了,一直 WA QAQ

//SIXIANG
#include <iostream> 
#include <vector>
#include <cstring> 
#include <cmath>
#define MAXN 100000
#define QWQ cout << "QWQ" << endl;
using namespace std;
char M[1035][1035];
bool used[1035], al[1035], m[1035][1035];
int n;
vector <int> bl, rem, rbl;

void work() {
	bl.clear(), rem.clear(), rbl.clear();
	memset(used, 0, sizeof(used));
	
	for(int p = 2; p <= n; p++) {
		if(m[1][p]) continue;
		if(al[p] || used[p]) continue;
		bl.push_back(p);
		for(int i = 1; i <= n; i++) {
			if(p == i) continue;
			if(al[i] || used[i]) continue;
			if(!m[p][i] && m[1][i]) {
				cout << p << ' ' << i << endl;  
				al[p] = 1, used[p] = used[i] = 1;
				break;
			}
		}
	}
	
	for(int p = 2; p <= n; p++)
		if(!al[p] && !used[p] && m[1][p]) {
			cout << 1 << ' ' << p << endl;
			al[p] = 1, used[1] = used[p] = 1;
			break;
		}
		
	for(int p = 0; p < bl.size(); p++)
		if(!used[bl[p]] && !al[bl[p]])
			rbl.push_back(bl[p]);
	for(int p = 0; p < rbl.size(); p += 2) {
		if(p + 1 >= rbl.size()) break;
		int x = rbl[p], y = rbl[p + 1];
		if(!m[x][y]) swap(x, y);
		cout << x << ' ' << y << endl;
		al[y] = used[x] = used[y] = 1;
	}
	if(rbl.size() & 1) rem.push_back(bl[rbl.size() - 1]);

	for(int p = 1; p <= n; p++)
		if(!used[p] && !al[p]) rem.push_back(p);
	for(int p = 0; p < rem.size(); p += 2) {
		cout << rem[p] << ' ' << rem[p + 1] << endl;
		int x = rem[p], y = rem[p + 1];
		if(!m[x][y]) swap(x, y);
		al[y] = used[x] = used[y] = 1;
	}
}
void init() {
	memset(al, 0, sizeof(al));
	memset(used, 0, sizeof(used));
	for(int p = 1; p <= n; p++)
		for(int i = 1; i <= n; i++)
			cin >> M[p][i], m[p][i] = M[p][i] - '0';

	int times = log2(n);
	while(times--)
		work();
}
int main() {
	while(cin >> n)
		init();	
}
2023/3/25 16:49
加载中...