超详细解释!我都被我自己惊呆了!

(这个题目意思我缓冲了很久!一定要读懂题!否则做不出来)

题目不懂就多读呀~

题目描述

李教授于今天下午做一个非常重要的演讲。不幸的是他不是一个非常爱整洁的人,他把自己做演讲要用的幻灯片随便堆放在一起。因此,演讲之前他不得不去整理这些幻灯片。做为一个讲求效率的学者,他希望尽可能简单地完成它。情况是这样,教授这次演讲一共要用n张幻灯片(n<=26),这n张幻灯片按照演讲要使用的顺序已经用数字1,2,…,n在上面编上了号。因为幻灯片是透明的,所以我们不能一下子看清每一个数字所对应的幻灯片。

现在我们用大写字母A,B,C,。。。再次把幻灯片依次编上号,如样例所示,我们可以很快发现编号为A的幻灯片是第4张,把它抽出来后我们又可以确定编号为C的幻灯片是第2张,。。。

你的任务是编写一个程序,把幻灯片的数字编号和字母编号对应起来,显然这种对应应该是唯一的;若是出现多种对应的情况或是某些数字编号和字母对应不起来,我们就称对应是无法实现的。

输入格式

第一行只有一个数n,表示有n张幻灯片,接下来的n行第行包括4个整数Xmin,Xmax,Ymin,Ymax(整数之间用空格分开),为幻灯片的坐标(该区域为幻灯片),这n张幻灯片按其在输入文件中出现的顺序从前到后依次编号为A,B,C,。。。再接下来的n行依次为n个数字编号的坐标X,Y,显然在幻灯片之外是不会有数字的。

(其实是键盘输入了啦)

输出格式

若是对应可以实现,你的输出应该包括n行,每一行为一个字母和一个数字,中间以一个空格隔开,并且各行以字母的升序排列,注意输出的字母要大写并且顶格;反之,若是对应无法实现,在文件的第一行顶格输出None即可。行首行末无多余空格。

(其实是屏幕输出了啦。。。)

样例输入

4
6 22 10 20
4 18 6 16
8 20 2 18
10 24 4 8
9 15
19 17
11 7
21 11

样例输出

A4
B1
C2
D3

代码:

 #include<iostream>
#include<cstdio>
#include<cstring> using namespace std; int n,anse;
int vis[][];
int head,QwQ[]; struct Q_zb{
Q_zb ()//进行初始化
{
top=;
ans=;
}
int xmin,xmax,ymin,ymax;
int top,ans;//统计答案
void add()
{
top++;
}
void shanchu()
{
top--;
}
}QAQ[]; void Q_in() //进行输入
{
int x,y; //横纵坐标
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d%d%d%d",&QAQ[i].xmin,&QAQ[i].xmax,&QAQ[i].ymin,&QAQ[i].ymax);
}
for(int i=;i<=n;i++) //第几张数字幻灯片
{
scanf("%d%d",&x,&y);
for(int k=;k<=n;k++) //第几张字母幻灯片
{
if(QAQ[k].xmin<=x&&QAQ[k].xmax>=x&&QAQ[k].ymin<=y&&QAQ[k].ymax>=y)
{
QAQ[k].add();
vis[k][i]=;//k表示第'k+64'张幻灯片 (字母幻灯片)
} //表示'k+64'张幻灯片可能是第几张数字幻灯片,进行标记
}
}
} bool Q_topos() //判断是否能够找到对应关系
{
for(int i=;i<=n;i++) //字母幻灯片
{
if(QAQ[i].top==) return ; //如果没有数字幻灯片与其对应,则该题无法做
if(QAQ[i].top==)
{
QwQ[++head]=i; //将'i+64'字母幻灯片入栈
}
}
if(head==) return ; //如果字母幻灯片中没有一一对应的幻灯片,说明形成了环,则该题无法做
do
{
int s=QwQ[head];//字母幻灯片
head--; //弹出
for(int k=;k<=n;k++)
{
if(vis[s][k])
{
anse=QAQ[s].ans=k;//记录答案,便于输出
}
}
for(int x=;x<=n;x++)
{
if(vis[x][anse])//如果'x+64'张幻灯片与
{
vis[x][anse]=;//消除标记
QAQ[x].shanchu();//个数--
if(QAQ[x].top==) QwQ[++head]=x;//若再发现一一对应的幻灯片,入栈
}
}
}while(head>);
for(int i=;i<=n;i++)//判断是否有结果,有则进行输出
if(!QAQ[i].ans) return ;
return ;
} void Q_print()
{
for(int i=;i<=n;i++)
{
cout<<char(i+);
//cout<<" ";
cout<<QAQ[i].ans<<endl;
}
} int main()
{
Q_in();
if(!Q_topos()) printf("None");
else Q_print();
return ;
}

还有一种暴力代码:

(ps:偷得代码啦)

上面如果看不懂的话,就试试暴力吧~(不好意思注释懒得打了……)

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int n,num,xx,yy;
}aa[];
int a[][];
struct rrrr{
int numm;bool aaa[];
}rudu[];
int cmp(const node & ac,const node & bc)
{
if(ac.num<bc.num)return ;
else return ;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
for(int j=;j<=;j++)
scanf("%d",&a[i][j]);
}
int x,y;
int ans[];
int vis[];
for(int i=;i<=n;i++)
{
scanf("%d%d",&x,&y);
aa[i].n=i;
aa[i].xx=x;
aa[i].yy=y;
for(int j=;j<=n;j++)
if(x>=a[j][]&&x<=a[j][]&&y>=a[j][]&&y<=a[j][])
{
aa[i].num++;
rudu[j].numm++;
rudu[j].aaa[i]=;
}
}
int tot=;
int flagg=;
for(int i=;i<=n;i++)
{
if(rudu[i].numm==)
{
flagg++;
}
}
if(flagg!=)
{
printf("None");
return ;
}
sort(aa+,aa+n+,cmp);
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(aa[i].xx>=a[j][]&&aa[i].xx<=a[j][]&&aa[i].yy>=a[j][]&&aa[i].yy<=a[j][]&&!vis[j])
{
vis[j]=;
ans[j]=aa[i].n;
tot++;
break;
}
}
for(int q=;q<=n;q++)
if(rudu[q].aaa[aa[i].n]==)
{
rudu[q].aaa[aa[i].n]=;
rudu[q].numm--;
}
}
int flag=;
for(int i=;i<=n;i++)
{
if(rudu[i].numm!=)
{
flag=;
break;
}
}
if(tot!=n||flag)
{
printf("None");
return ;
}
else
for(int i=;i<=n;i++)
{
printf("%c",i+);
printf("%d",ans[i]);
cout<<endl;
}
return ;
}
05-11 22:27