思路和紫书相同,首先记录队伍1能够打败哪些队伍,以及哪些队伍会打败队伍1,然后对于那些会打败队伍1的队伍,每次都从队伍1能够赢的队伍中找出某一队,正好打败这个队伍,如果找不到,那么就将这些队伍放置到容器fin中,以便后续处理,然后从队伍1的赢得的队伍中找出某一位,让队伍1打败,然后将其余的保存到容器中,让那些在fin中的队伍相互对打,将那些胜利队伍放置到对应的容器中,以此迭代,同时在迭代的过程中输出结果,具体实现见如下代码:
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<sstream>
#include<cstdio>
#include<deque>
#include<functional>
using namespace std;
const int maxn = 1024 + 10;
int data[maxn][maxn];
int main(){
int n;
while (cin >> n){
for (int i = 1; i <= n; i++){
string t;
cin >> t;
for (int j = 0; j < n; j++)
data[i][j + 1] = t[j] - '0';
}
vector<int> win, lose;
for (int i = 2; i <= n; i++){
if (data[1][i] == 1) win.push_back(i);
else lose.push_back(i);
}
while (n > 1){
vector<int> win2, lose2, fin;
for (int i = 0; i < lose.size(); i++){
int id = lose[i];
bool get = false;
for (int j = 0; j < win.size(); j++){
if (win[j]>0&&data[win[j]][id] == 1){
get = true;
win2.push_back(win[j]);
cout << win[j] << " " << id << endl;
win[j] = 0;
break;
}
}
if (!get){
fin.push_back(id);
}
}
bool first = true;
for (int i = 0; i < win.size(); i++){
if (win[i] > 0){
if (first){
cout << "1 " << win[i] << endl;
first = false;
}
else{
fin.push_back(win[i]);
}
}
}
for (int i = 0; i < fin.size(); i += 2){
cout << fin[i] << " " << fin[i + 1] << endl;
int id = fin[i];
if (data[fin[i]][fin[i + 1]] == 0) id = fin[i + 1];
if (data[1][id] == 1) win2.push_back(id);
else lose2.push_back(id);
}
win = win2;
lose = lose2;
n >>= 1;
}
}
return 0;
}