Page 527
出现的 大 错误:ans[ ] 内的数不是一个一个挨着放进去的 !而是按照扫到的范围的顺序放进去
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int n;
struct H{
int x1,x2,y1,y2;
}card[30];
struct K{
int x,y;
}f[30];
int tree[30][30],r[30],ans[30],tree2[30][30];
bool p[30];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d%d",&card[i].x1,&card[i].x2,&card[i].y1,&card[i].y2);
}
for(int i=1;i<=n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
f[i].x=a,f[i].y=b;
for(int j=1;j<=n;j++)
{
if(a>=card[j].x1&&a<=card[j].x2&&b<=card[j].y2&&b>=card[j].y1)
{
tree[i][++tree[i][0]]=j; //点对应的范围
tree2[j][++tree2[j][0]]=i;
r[j]++;//范围的入度,内有几个点
}
}
}
int num=0;
while(num<n)
{
int t=0,i;
for(i=1;i<=n;i++)
{
if(r[i]==1)//如果范围对应的点只有一个
{
int x;
for(int k=1;k<=tree2[i][0];k++)
if(!p[tree2[i][k]])
{
ans[i]=tree2[i][k],p[ans[i]]=true;break;//ans[ ] 内的数不是一个一个挨着放进去的 !而是按照扫到的范围的顺序放进去
}
t++;num++;
r[i]=0x7fffffff;
}
for(int j=1;j<=tree[ans[i]][0];j++)
r[tree[ans[i]][j]]--;
}
if(t==0)
{
printf("None");
return 0;
}
}
for(int i=1;i<=n;i++)
{
char c;
c=i+'A'-1;
printf("%c %d
",c,ans[i]);
}
return 0;
}