1395:煩人的幻燈片(slides)
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 753 通過數: 416
【題目描述】
李教授將於今天下午作一次非常重要的演講。不幸的事他不是一個非常愛整潔的人,他把自己演講要用的幻燈片隨便堆在了一起。因此,演講之前他不得不去整理這些幻燈片。作為一個講求效率的學者,他希望盡可能簡單地完成它。教授這次演講一共要用n張幻燈片(n≤26),這n張幻燈片按照演講要使用的順序已經用數字1~n編了號。因為幻燈片是透明的,所以我們不能一下子看清每一個數字所對應的幻燈片。
現在我們用大寫字母A,B,C……再次把幻燈片依次編號。你的任務是編寫一個程序,把幻燈片的數字編號和字母編號對應起來,顯然這種對應應該是唯一的;若出現多種對應的情況或是某些數字編號和字母編號對應不起來,我們稱對應是無法實現的。
【輸入】
第一行只有一個整數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
【輸出樣例】
A 4 B 1 C 2 D 3
記錄每個數字對應幾個字母 每次找出度為1的數字入隊,進行拓撲排序.
#include<bits/stdc++.h> using namespace std; const int ll=50; struct node { int xi,xa,yi,ya; } qu[ll]; struct point { int x,y; } po[ll]; int n,sum; int du[ll],book[ll][ll],ans[ll]; void find(int x) { sum++; du[x]--; for(int i=1; i<=n; ++i) { if(book[x][i]) { ans[i]=x; book[x][i]=0; for(int j=1; j<=n; ++j) { if(book[j][i]) { du[j]--; book[j][i]=0; if(du[j]==1) find(j); } } break; } } return ; } int main() { cin>>n; for(int i=1; i<=n; ++i) { cin>>qu[i].xi>>qu[i].xa>>qu[i].yi>>qu[i].ya ; } for(int i=1; i<=n; ++i) { cin>>po[i].x >>po[i].y; int cnt = 0; for(int j=1; j<=n; ++j) { if(po[i].x <=qu[j].xa&&po[i].x >=qu[j].xi&&po[i].y <=qu[j].ya &&po[i].y>=qu[j].yi) { book[i][j]=1; cnt++; } } du[i]=cnt; } for(int i=1; i<=n; ++i) { if(du[i]==1) { find(i); } } if(sum<n) { cout<<"None\n"; } else { for(int i=1; i<=n; ++i) { cout<<char(i-1+'A')<<" "<<ans[i]<<endl; } } return 0; }