//不知道如何将字母和数字对应起来
#include<iostream>
#include<stack>
#include<cstring>
using namespace std;
const int MAXN=1000;
int outd[MAXN],ans[MAXN];
int n;
bool a[MAXN][MAXN];
stack<int> st;
struct slide{
int x_min,x_max,y_min,y_max;
} s[MAXN];//结构体 幻灯片
struct letter{
int x,y;
} l[MAXN];//结构体 数字
bool judge(int i,int j)
{
if (l[i].x>=s[j].x_min && l[i].x<=s[j].x_max && l[i].y>=s[j].y_min && l[i].y<=s[j].y_max) return true;
else return false;
}//判断数字与幻灯片能否对应
void print()
{
char ch;
int b[MAXN];
for (int i=1; i<=n; i++) b[ans[i]]=i;//将数字与幻灯片的对应转化为幻灯片与数字的对应
for (int i=1; i<=n; i++)
{
ch=i-1+'A';
cout<<ch<<' '<<b[i]<<endl;
}
}//输出
int main()
{
int i,j,temp,num=0,item;
memset(outd,0,sizeof(outd));
cin>>n;
for (i=1; i<=n; i++) cin>>s[i].x_min>>s[i].x_max>>s[i].y_min>>s[i].y_max;//输入幻灯片坐标
for (i=1; i<=n; i++)//幻灯片数字
{
cin>>l[i].x>>l[i].y;
for (j=1; j<=n; j++)//幻灯片字母
{
a[i][j]=judge(i,j);
if (a[i][j]) outd[i]++;//如果可以对应幻灯片数字 出度加一
}
}
for (i=1; i<=n; i++)
if (outd[i]==1)//寻找出度为一的点
{
st.push(i);//进栈
for (j=1; j<=n ;j++)
if (a[i][j])
{
a[i][j]=false;
ans[i]=j;// j是幻灯片字母 ,i幻灯片数字对应的幻灯片字母
num++;//个数加一
break;
}
outd[i]=0;//注意这里要修改出度 防止以后再次访问这个点
}
while (!st.empty())//当栈不为空时
{
temp=st.top();
st.pop();//出栈
item=ans[temp];
for (i=1; i<=n; i++) //幻灯片数字
if(a[i][item])
{
a[i][item]=false;
outd[i]--;//幻灯片数字出度--
}//删掉与该幻灯片相连的所有边
for (i=1; i<=n; i++) //再看有没有出度为1的幻灯片数字
if (outd[i]==1)
{
st.push(i);
for (j=1; j<=n ;j++)
if (a[i][j])
{
a[i][j]=false;
ans[i]=j;
num++;
break;
}
outd[i]=0;
}//寻找出度为一的点 同上
}
if (num==n) print();
else cout<<"None"<<endl;//输出
}
烦人的幻灯片
最新推荐文章于 2023-07-24 11:00:00 发布