这个题真的是恶意满满... 找同性的你们还找中间人 emmmmm
如果把4位id当作整数去处理就会遇到极大的坑:
1.有小于4位的值,输出的时候需要补零
2.最大的坑.case2中会有-0000 http://blog.csdn.net/gl486546/article/details/78816363 看这个大神的帖子才发现这个问题,之前想到了0点会有问题 ,但是真的没有想到会出-0这样的坑.
所以还是用string读入在处理比较好
除了上面的问题之外,还有一个会有问题的地方就是,A,B的中间人 C,D是不能有A,B的,特别注意这个点.
PS.程序写的贼傻,后面再慢慢改了.
#include <iostream>
#include <cstring>
#include <climits>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <set>
#define MAX 10010
#define MAX2 310
using namespace std;
struct node{
bool isGirl;
int boy[MAX2];
int girl[MAX2];
int bnum;
int gnum;
node(){bnum=gnum=-1;};
};
node m[MAX];
struct ansnode{
int id1;
int id2;
};
bool cmp(ansnode n1 ,ansnode n2){
if(n1.id1 != n2.id1)
return n1.id1 < n2.id1;
return n1.id2 < n2.id2;
}
void DFS(int i1, int i2 ,bool g1,bool g2){
vector <ansnode> ans;
if(!g1 && g2){//boy -> girl
for(int i = 0 ;i <= m[i1].bnum ;i++){//boy's girl friends
int u = m[i1].boy[i];
for(int j = 0 ; j <= m[u].gnum; j++){//girl's girl friends
int v = m[u].girl[j];
for(int z = 0; z <= m[v].gnum;z++){//isEqual i2
if(i1 != v && i2 !=v && i1 != u && i2 !=u && i2 == m[v].girl[z]){//u,v != i1,i2
ansnode temp;
temp.id2 = v;
temp.id1 = u;
ans.push_back(temp);
break;
}
}
}
}
}
else if(g1 && !g2){//girl -> boy
for(int i = 0 ;i <= m[i1].gnum; i++){
int u = m[i1].girl[i];
for(int j = 0;j <= m[u].bnum ;j++){
int v = m[u].boy[j];
for(int z = 0; z <= m[v].bnum;z++){
if(i1 != v && i2 !=v &&i1 != u && i2 !=u &&i2 == m[v].boy[z]){
ansnode temp;
temp.id2 = v;
temp.id1 = u;
ans.push_back(temp);
break;
}
}
}
}
}
else if(g1 && g2){//girl -> girl
for(int i = 0 ;i <= m[i1].gnum ;i++){
int u = m[i1].girl[i];
for(int j = 0 ; j <= m[u].gnum; j++){
int v = m[u].girl[j];
for(int z = 0; z <= m[v].gnum;z++){
if(i1 != v && i2 !=v &&i1 != u && i2 !=u && i2 == m[v].girl[z]){
ansnode temp;
temp.id2 = v;
temp.id1 = u;
ans.push_back(temp);
break;
}
}
}
}
}
else{//boy->boy
for(int i = 0 ;i <= m[i1].bnum ;i++){
int u = m[i1].boy[i];
for(int j = 0 ; j <= m[u].bnum; j++){
int v = m[u].boy[j];
for(int z = 0; z <= m[v].bnum;z++){
if(i1 != v && i2 !=v &&i1 != u && i2 !=u && i2 == m[v].boy[z]){
ansnode temp;
temp.id2 = v;
temp.id1 = u;
ans.push_back(temp);
break;
}
}
}
}
}
cout << ans.size() << endl;
if(ans.size() != 0)
sort(ans.begin(),ans.end(),cmp);
for(int i = 0 ;i < ans.size() ;i++){
// cout << ans[i].id1 << " " << ans[i].id2 << endl;
printf("%04d %04d\n",ans[i].id1,ans[i].id2);
}
}
int n,k;
int str2int(string s, bool isGirl){
int num = 0;
if(isGirl){
for(int i = 1; i < s.size() ;i++){
num *= 10;
num += ( s[i] - '0');
}
}
else{
for(int i = 0; i < s.size() ;i++){
num *= 10;
num += ( s[i] - '0');
}
}
return num;
}
int main(){
scanf("%d%d",&n,&k);
for(int i = 0;i < k ;i++){
int id1,id2;
bool g1 = false;
bool g2 = false;
string d1,d2;
cin >> d1 >> d2;
if(d1[0] == '-')
g1= true;
if(d2[0] == '-')
g2= true;
id1 = str2int(d1,g1);
id2 = str2int(d2,g2);
m[id1].isGirl = g1;
m[id2].isGirl = g2;
if(g1)
m[id2].girl[++m[id2].gnum] = id1;
else
m[id2].boy[++m[id2].bnum] = id1;
if(g2)
m[id1].girl[++m[id1].gnum] = id2;
else
m[id1].boy[++m[id1].bnum] = id2;
}
int z;
scanf("%d",&z);
for(int i = 0; i < z ;i++){
int id1,id2;
bool g1 = false;
bool g2 = false;
string d1,d2;
cin >> d1 >> d2;
if(d1[0] == '-')
g1= true;
if(d2[0] == '-')
g2= true;
id1 = str2int(d1,g1);
id2 = str2int(d2,g2);
DFS(id1,id2,g1,g2);
}
return 0;
}