糊涂的教授【拓扑排序】
糊涂的教授
題目大意:
有n個矩陣(有些部分重疊在一起),現在有一些位置寫著一些數字,表示它原來的序號,問每一個矩陣原來的序號
原題:
題目描述
陳教授是一個國際知名的教授,很多單位都爭先恐后邀請他演講,今天下午陳教授就要做一個非常重要的演講。由于陳教授年紀大了,對于一些不重要的小事情有點糊涂,今天上午他把自己做演講要用的幻燈片隨便堆放在一起。因此,演講之前他不得不去整理這些幻燈片。由于時間很緊,他希望盡可能簡單地完成它。情況是這樣,陳教授這次演講一共要用 n 張幻燈片(n<=26),這 n 張幻燈片按照演講要使用的順序已經用數字 1,2,…,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解題思路:
一個點在多少個矩陣之中,為入讀,然后跑拓撲排序就可以了
代碼:
#include<cstdio> #define max(a,b) (a)>(b)?(a):(b) using namespace std; int n,k,p,num,ax,ay,x[30],xx[30],y[30],yy[30],l[30],pp[30],ans[30],a[30][30]; int main() {scanf("%d",&n);for (int i=1;i<=n;++i)scanf("%d %d %d %d",&x[i],&xx[i],&y[i],&yy[i]);for (int i=1;i<=n;++i){scanf("%d %d",&ax,&ay);for (int j=1;j<=n;++j)if (ax>=x[j]&&ax<=xx[j]&&ay>=y[j]&&ay<=yy[j])a[j][i]=1,l[j]++;}k=n;while (k){p=0;for (int i=1;i<=n;++i)if (l[i]==1)//可以確定了{k--;p=1;for (int j=1;j<=n;++j)if (a[i][j])//尋找連接的點{num=j;break;}for (int j=1;j<=n;++j)if (a[j][num])//相連的點入度-1{a[j][num]=0;l[j]--;}ans[i]=num;//記錄}if (!p){printf("None");break;}}if (p)for (int i=1;i<=n;++i)printf("%c %d\n",i+65-1,ans[i]);//輸出 }總結
以上是生活随笔為你收集整理的糊涂的教授【拓扑排序】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打击犯罪【并查集】
- 下一篇: 路由器怎么设置帐号和密码家里的路由器如何