如题,真的是水题,但是写炸了,一直 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();
}