原题链接:https://vjudge.net/problem/UVA-1609
分类:构造法
备注:思维题
#include<bits/stdc++.h>
using namespace std;
const int maxn=1050;
char g[maxn][maxn];
int vis[maxn],out[maxn],len;
void dfs(int n){
if(n==1)return;
memset(vis,0,sizeof(vis));
for(int i=2;i<=len;i++){
if(out[i]||vis[i])continue;
if(g[1][i]=='0'){
for(int j=2;j<=len;j++){
if(out[j]||vis[j])continue;
if(g[1][j]=='1'&&g[j][i]=='1'){
vis[i]=vis[j]=1;
out[i]=1;
printf("%d %d\n",i,j);
break;
}
}
}
}
for(int i=2;i<=len;i++){
if(out[i]||vis[i])continue;
if(g[1][i]=='1'){
printf("1 %d\n",i);
vis[i]=1;
out[i]=1;
break;
}
}
int flg=0,pre=0;
for(int i=2;i<=len;i++){
if(out[i]||vis[i])continue;
if(g[1][i]=='0'){
if(!flg){
flg=1; pre=i;
}else{
flg=0;
vis[pre]=vis[i]=1;
printf("%d %d\n",pre,i);
if(g[pre][i]=='0')out[pre]=1;
else out[i]=1;
}
}
}
flg=0;
for(int i=2;i<=len;i++){
if(out[i]||vis[i])continue;
if(!flg){
flg=1; pre=i;
}else{
flg=0;
vis[pre]=vis[i]=1;
printf("%d %d\n",pre,i);
if(g[pre][i]=='0')out[pre]=1;
else out[i]=1;
}
}
dfs(n>>1);
}
int main(void){
//freopen("in.txt","r",stdin);
while(~scanf("%d",&len)){
for(int i=1;i<=len;i++)
scanf("%s",g[i]+1);
memset(out,0,sizeof(out));
dfs(len);
}
return 0;
}