题目链接:https://vjudge.net/problem/UVA-1609
参见紫书第八章例题8-17题解
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int N=1024+5;
char g[N][N];
int n;
bool vis[N];
int main()
{
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
scanf("%s",g[i]);
int t=n;
memset(vis,false,sizeof(vis));
while(t)
{
bool vis0[N];
memcpy(vis0,vis,sizeof(vis));
vector<int> b;
for(int i=1;i<n;i++)
if(!vis[i]&&g[0][i]=='0')
b.push_back(i);
int l=b.size();
for(int i=0;i<l;i++)
{
for(int j=0;j<n;j++)
if(!vis0[j]&&g[b[i]][j]=='0'&&g[0][j]=='1')
{
printf("%d %d\n",j+1,b[i]+1);
vis0[b[i]]=vis0[j]=true;
vis[b[i]]=true;
b.erase(b.begin()+i);
l--;
i--;
break;
}
}
for(int i=1;i<n;i++)
if(!vis0[i]&&g[0][i]=='1')
{
printf("1 %d\n",i+1);
vis0[0]=vis0[i]=vis[i]=true;
break;
}
for(int i=0;i<l-1;i+=2)
{
printf("%d %d\n",b[i]+1,b[i+1]+1);
vis0[b[i]]=vis0[b[i+1]]=true;
if(g[b[i]][b[i+1]]=='1') vis[b[i+1]]=true;
else vis[b[i]]=true;
}
int v;
v=-1;
for(int i=1;i<n;i++)
if(!vis0[i])
{
if(v!=-1)
{
printf("%d %d\n",v+1,i+1);
vis0[v]=vis0[i]=true;
if(g[v][i]=='1') vis[i]=true;
else vis[v]=true;
v=-1;
}
else v=i;
}
t/=2;
if(t==1) break;
}
}
return 0;
}