0%

UVA1605题:联合国大楼(机智题)

题意

首先是传送门:https://vjudge.net/problem/UVA-1605

下面是翻译的题意

联合国决定在俄罗斯圣彼得堡建立新的总部。将采用矩形平行六面体的形式,将由几个矩形地板组成,一个在另一个之上。
每一层都是相同尺寸的矩形网格,这个网格的每个单元都是一个办公室。
如果两间办公室位于同一层,共用一面墙,则视为相邻,
如果一个人的地板是另一个人的天花板,也视为相邻。
圣彼得堡大楼将接待各国代表团。每个国家都有几个办事处的一套连接形式。此外,现代政治形势表明,各国可能希望结成秘密联盟。因此每一对国家必须至少有一对相邻的办公室,这样他们才能为了以防万一进行隔着墙或天花板的秘密两两谈判。
你受雇为联合国设计一个合适的建筑。

具体题意我不解释了,请移步至原题处(后面的很多题我可能都不会花大篇幅去解释题意了)。

分析

为什么这是一道机智题。。因为我们既然要将所有国家都两两相邻,而且天花板接着地面都算相邻,那我们就直接利用这个两层的条件,第一层放一排A,第二层直接在一排A的位置上放A,B,C,D,E,F,G。。。。所以我们会发现,假设我们有四个国家ABCD,直接

1
2
3
4
5
6
7
8
9
AAAA
BBBB
CCCC
DDDD

ABCD
ABCD
ABCD
ABCD

哇,很简单有木有!所以我们的代码就呼之欲出了。。。真的是机智题啊!

小注意点:50个n要用小写字母+大写字母表示,注意ASCII码中大写字母与小写字母并不连续!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
using namespace std;
char first[50][50];
char second[50][50];
int main(){
int n;
while(cin>>n){
cout << 2 << ' ' << n << ' ' << n << endl;
char c;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i<26)
c='A'+i;
else
c='a'+i-26;
first[i][j]=second[j][i]=c;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout << first[i][j];
}
cout << endl;
}
cout << endl;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout << second[i][j];
}
cout << endl;
}
}
return 0;
}