2020年HZNU天梯训练赛 Round 5
2020年HZNU天梯训练赛 Round 5
时间:2020.7.21 19 180
完成情况:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
√ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | ※ | |||
✘ | ✘ |
√ 当场做出来 ※做了一半来 ✘补题补出来
7-1 出生年 (15分)
以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y
年,直到x
岁才遇到n
个数字都不相同的年份”这句话。
输入格式:
输入在一行中给出出生年份y
和目标年份中不同数字的个数n
,其中y
在[1, 3000]之间,n
可以是2、或3、或4。注意不足4位的年份要在前面补零,例如公元1年被认为是0001年,有2个不同的数字0和1。
输出格式:
根据输入,输出x
和能达到要求的年份。数字间以1个空格分隔,行首尾不得有多余空格。年份要按4位输出。注意:所谓“n
个数字都不相同”是指不同的数字正好是n
个。如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。
输入样例1:
1988 4
输出样例1:
25 2013
输入样例2:
1 2
输出样例2:
0 0001
注意数据范围
#include<bits/stdc++.h>
using namespace std;
int main()
{
int y,x;
cin>>y>>x;
for(int i=y;i<3100;i++)//这里范围很重要 3001会卡点
{
int n=i;
set<int>s;
for(int j=0;j<4;j++){s.insert(n%10);n/=10;}
if(s.size()==x){printf("%d %04d\n",i-y,i);break;}
}
return 0;
}
7-2 点赞 (20分)
微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。本题就要求你写个程序,通过统计一个人点赞的纪录,分析这个人的特性。
输入格式:
输入在第一行给出一个正整数N(≤1000),是该用户点赞的博文数量。随后N行,每行给出一篇被其点赞的博文的特性描述,格式为“K F1⋯F**K”,其中1≤K≤10,F**i(i=1,⋯,K)是特性标签的编号,我们将所有特性标签从1到1000编号。数字间以空格分隔。
输出格式:
统计所有被点赞的博文中最常出现的那个特性标签,在一行中输出它的编号和出现次数,数字间隔1个空格。如果有并列,则输出编号最大的那个。
输入样例:
4
3 889 233 2
5 100 3 233 2 73
4 3 73 889 2
2 233 123
输出样例:
233 3
数组下标计数
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k,x,maxx=0,maxn=0;
cin>>n;
int a[1005] = {0};
for(int i=0;i<n;i++)
{
cin>>k;
for(int j=0;j<k;j++) {cin>>x;a[x]++;}
}
for(int i=0;i<1001;i++)
{
if (a[i]>=maxx) {maxx=a[i];maxn=i;}
}
cout<<maxn<<" "<<maxx;
return 0;
}
7-3 情人节 (15分)
以上是朋友圈中一奇葩贴:“2月14情人节了,我决定造福大家。第2个赞和第14个赞的,我介绍你俩认识…………咱三吃饭…你俩请…”。现给出此贴下点赞的朋友名单,请你找出那两位要请客的倒霉蛋。
输入格式:
输入按照点赞的先后顺序给出不知道多少个点赞的人名,每个人名占一行,为不超过10个英文字母的非空单词,以回车结束。一个英文句点.
标志输入的结束,这个符号不算在点赞名单里。
输出格式:
根据点赞情况在一行中输出结论:若存在第2个人A和第14个人B,则输出“A and B are inviting you to dinner...”;若只有A没有B,则输出“A is the only one for you...”;若连A都没有,则输出“Momo... No one is for you ...”。
输入样例1:
GaoXZh
Magi
Einst
Quark
LaoLao
FatMouse
ZhaShen
fantacy
latesum
SenSen
QuanQuan
whatever
whenever
Potaty
hahaha
.
输出样例1:
Magi and Potaty are inviting you to dinner...
输入样例2:
LaoLao
FatMouse
whoever
.
输出样例2:
FatMouse is the only one for you...
输入样例3:
LaoLao
.
输出样例3:
Momo... No one is for you ...
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s,s1,s2;
int i=0;
//memset(s,0,sizeof(s));
//memset(s1,0,sizeof(s1));
//memset(s2,0,sizeof(s2));
while(cin>>s)
{
if(s==".")break;
if(i==1)s1=s;
if(i==13)s2=s;
i++;
}
//if(s1!='\0'&&s2!='\0'&&i>13)
if(i>13)cout<<s1<<" and "<<s2<<" are inviting you to dinner...";
else if(i>1)cout<<s1<<" is the only one for you...";
else cout<<"Momo... No one is for you ...";
return 0;
}
/*
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s[10],s1[10],s2[10];
int i=0;
memset(s,0,sizeof(s));
memset(s1,0,sizeof(s1));
memset(s2,0,sizeof(s2));
while(cin>>s)
{
if(s[0]=='.')break;
if(i==1)
{
for(int j=0;j<strlen(s);j++)s1[j]=s[j];
}
if(i==13)
{
for(int j=0;j<strlen(s);j++)s2[j]=s[j];
}
i++;
}
//if(s1!='\0'&&s2!='\0'&&i>13)
if(i>13)cout<<s1<<" and "<<s2<<" are inviting you to dinner...";
else if(i>1)cout<<s1<<" is the only one for you...";
else cout<<"Momo... No one is for you ...";
return 0;
}
//您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起*/
7-4 A乘以B (5分)
看我没骗你吧 —— 这是一道你可以在10秒内完成的题:给定两个绝对值不超过100的整数A和B,输出A乘以B的值。
输入格式:
输入在第一行给出两个整数A和B(−100≤A,B≤100),数字间以空格分隔。
输出格式:
在一行中输出A乘以B的值。
输入样例:
-8 13
输出样例:
-104
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
cout<<a*b;
return 0;
}
7-5 A除以B (10分)
真的是简单题哈 —— 给定两个绝对值不超过100的整数A和B,要求你按照“A/B=商”的格式输出结果。
输入格式:
输入在第一行给出两个整数A和B(−100≤A,B≤100),数字间以空格分隔。
输出格式:
在一行中输出结果:如果分母是正数,则输出“A/B=商”;如果分母是负数,则要用括号把分母括起来输出;如果分母为零,则输出的商应为Error
。输出的商应保留小数点后2位。
输入样例1:
-1 2
输出样例1:
-1/2=-0.50
输入样例2:
1 -3
输出样例2:
1/(-3)=-0.33
输入样例3:
5 0
输出样例3:
5/0=Error
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
cout<<a<<"/";
if(b<0)cout<<"("<<b<<")=";
else if(b==0)
{
cout<<b<<"=Error";return 0;
}
else cout<<b<<"=";
double ans=1.0*a/b;
printf("%.2lf",ans);
return 0;
}
7-6 新世界 (5分)
这道超级简单的题目没有任何输入。
你只需要在第一行中输出程序员钦定名言“Hello World”,并且在第二行中输出更新版的“Hello New World”就可以了。
Hello World
Hello New World
7-7 古风排版 (20分)
中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。
输入格式:
输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。
输出格式:
按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。
输入样例:
4
This is a test case
输出样例:
asa T
st ih
e tsi
ce s
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,len,t,cnt;
char s[1005],s2[105][1005];
cin>>n;getchar();
cin.getline(s,1005);
t=(strlen(s)+n-1)/n;
cnt=0;
for(int i=t-1;i>=0;i--)
{
for(int j=0;j<n;j++)
{
if(cnt<strlen(s)) s2[j][i]=s[cnt++];
else s2[j][i] = ' ';
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<t;j++)cout<<s2[i][j];cout<<endl;
}
return 0;
}
7-8 最佳情侣身高差 (10分)
专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高)。如果符合,你俩的身高差不管是牵手、拥抱、接吻,都是最和谐的差度。
下面就请你写个程序,为任意一位用户计算他/她的情侣的最佳身高。
输入格式:
输入第一行给出正整数N(≤10),为前来查询的用户数。随后N行,每行按照“性别 身高”的格式给出前来查询的用户的性别和身高,其中“性别”为“F”表示女性、“M”表示男性;“身高”为区间 [1.0, 3.0] 之间的实数。
输出格式:
对每一个查询,在一行中为该用户计算出其情侣的最佳身高,保留小数点后2位。
输入样例:
2
M 1.75
F 1.8
输出样例:
1.61
1.96
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
double h;
char s[3];
cin>>n;
while(n--)
{
scanf("%s %lf",s,&h);
if(s[0]=='M') printf("%.2lf\n",h/1.09);
else if(s[0]=='F') printf("%.2lf\n",h*1.09);
}
return 0;
}
7-9 人以群分 (25分)
社交网络中我们给每个人定义了一个“活跃度”,现希望根据这个指标把人群分为两大类,即外向型(outgoing,即活跃度高的)和内向型(introverted,即活跃度低的)。要求两类人群的规模尽可能接近,而他们的总活跃度差距尽可能拉开。
输入格式:
输入第一行给出一个正整数N(2≤N≤105)。随后一行给出N个正整数,分别是每个人的活跃度,其间以空格分隔。题目保证这些数字以及它们的和都不会超过231。
输出格式:
按下列格式输出:
Outgoing #: N1
Introverted #: N2
Diff = N3
其中N1
是外向型人的个数;N2
是内向型人的个数;N3
是两群人总活跃度之差的绝对值。
输入样例1:
10
23 8 10 99 46 2333 46 1 666 555
输出样例1:
Outgoing #: 5
Introverted #: 5
Diff = 3611
输入样例2:
13
110 79 218 69 3721 100 29 135 2 6 13 5188 85
输出样例2:
Outgoing #: 7
Introverted #: 6
Diff = 9359
#include<bits/stdc++.h>
using namespace std;
//总活跃度差距尽可能拉开
const int maxn=1e5+5;
int a[maxn];
int main()
{
int n,m,cnt1=0,cnt2=0;
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n);
for(int i=0;i<n/2;i++)cnt1+=a[i];
for(int i=n/2;i<n;i++)cnt2+=a[i];
cout<<"Outgoing #: "<<(n+1)/2<<endl;
cout<<"Introverted #: "<<n/2<<endl;
cout<<"Diff = "<<cnt2-cnt1<<endl;
return 0;
}
7-10 多项式A除以B (25分)
这仍然是一道关于A/B的题,只不过A和B都换成了多项式。你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数。
输入格式:
输入分两行,每行给出一个非零多项式,先给出A,再给出B。每行的格式如下:
N e[1] c[1] ... e[N] c[N]
其中N
是该多项式非零项的个数,e[i]
是第i
个非零项的指数,c[i]
是第i
个非零项的系数。各项按照指数递减的顺序给出,保证所有指数是各不相同的非负整数,所有系数是非零整数,所有整数在整型范围内。
输出格式:
分两行先后输出商和余,输出格式与输入格式相同,输出的系数保留小数点后1位。同行数字间以1个空格分隔,行首尾不得有多余空格。注意:零多项式是一个特殊多项式,对应输出为0 0 0.0
。但非零多项式不能输出零系数(包括舍入后为0.0)的项。在样例中,余多项式其实有常数项-1/27
,但因其舍入后为0.0,故不输出。
输入样例:
4 4 1 2 -3 1 -1 0 -1
3 2 3 1 -2 0 1
输出样例:
3 2 0.3 1 0.2 0 -1.0
1 1 -3.1
7-11 悄悄关注 (25分)
新浪微博上有个“悄悄关注”,一个用户悄悄关注的人,不出现在这个用户的关注列表上,但系统会推送其悄悄关注的人发表的微博给该用户。现在我们来做一回网络侦探,根据某人的关注列表和其对其他用户的点赞情况,扒出有可能被其悄悄关注的人。
输入格式:
输入首先在第一行给出某用户的关注列表,格式如下:
人数N 用户1 用户2 …… 用户N
其中N
是不超过5000的正整数,每个用户i
(i
=1, ..., N
)是被其关注的用户的ID,是长度为4位的由数字和英文字母组成的字符串,各项间以空格分隔。
之后给出该用户点赞的信息:首先给出一个不超过10000的正整数M
,随后M
行,每行给出一个被其点赞的用户ID和对该用户的点赞次数(不超过1000),以空格分隔。注意:用户ID是一个用户的唯一身份标识。题目保证在关注列表中没有重复用户,在点赞信息中也没有重复用户。
输出格式:
我们认为被该用户点赞次数大于其点赞平均数、且不在其关注列表上的人,很可能是其悄悄关注的人。根据这个假设,请你按用户ID字母序的升序输出可能是其悄悄关注的人,每行1个ID。如果其实并没有这样的人,则输出“Bing Mei You”。
输入样例1:
10 GAO3 Magi Zha1 Sen1 Quan FaMK LSum Eins FatM LLao
8
Magi 50
Pota 30
LLao 3
Ammy 48
Dave 15
GAO3 31
Zoro 1
Cath 60
输出样例1:
Ammy
Cath
Pota
输入样例2:
11 GAO3 Magi Zha1 Sen1 Quan FaMK LSum Eins FatM LLao Pota
7
Magi 50
Pota 30
LLao 48
Ammy 3
Dave 15
GAO3 31
Zoro 29
输出样例2:
Bing Mei You
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,x,sum=0,aver,flag=0;
string s;
cin>>n;
map<string,int> vis,Map;
for(int i=0;i<n;i++){cin>>s;vis[s]=1;}
cin>>m;
for(int i=0;i<m;i++){cin>>s>>x;Map[s]=x;sum+=x;}
aver=sum/m;
map<string,int>::iterator it;//迭代器遍历整个map
for(it=Map.begin();it!=Map.end();it++)
{
if(it->second>aver&&vis[it->first]==0)
{
cout<<it->first<<endl;flag=1;
}
}
if(flag==0) cout<<"Bing Mei You"<<endl;
return 0;
}
7-12 功夫传人 (25分)
一门武功能否传承久远并被发扬光大,是要看缘分的。一般来说,师傅传授给徒弟的武功总要打个折扣,于是越往后传,弟子们的功夫就越弱…… 直到某一支的某一代突然出现一个天分特别高的弟子(或者是吃到了灵丹、挖到了特别的秘笈),会将功夫的威力一下子放大N倍 —— 我们称这种弟子为“得道者”。
这里我们来考察某一位祖师爷门下的徒子徒孙家谱:假设家谱中的每个人只有1位师傅(除了祖师爷没有师傅);每位师傅可以带很多徒弟;并且假设辈分严格有序,即祖师爷这门武功的每个第i
代传人只能在第i-1
代传人中拜1个师傅。我们假设已知祖师爷的功力值为Z
,每向下传承一代,就会减弱r%
,除非某一代弟子得道。现给出师门谱系关系,要求你算出所有得道者的功力总值。
输入格式:
输入在第一行给出3个正整数,分别是:N(≤105)——整个师门的总人数(于是每个人从0到N−1编号,祖师爷的编号为0);Z——祖师爷的功力值(不一定是整数,但起码是正数);r ——每传一代功夫所打的折扣百分比值(不超过100的正数)。接下来有N行,第i行(i=0,⋯,N−1)描述编号为i的人所传的徒弟,格式为:
K**i ID[1] ID[2] ⋯ ID[K**i]
其中K**i是徒弟的个数,后面跟的是各位徒弟的编号,数字间以空格间隔。K**i为零表示这是一位得道者,这时后面跟的一个数字表示其武功被放大的倍数。
输出格式:
在一行中输出所有得道者的功力总值,只保留其整数部分。题目保证输入和正确的输出都不超过1010。
输入样例:
10 18.0 1.00
3 2 3 5
1 9
1 4
1 7
0 7
2 6 1
1 8
0 9
0 4
0 3
输出样例:
404
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100005;
int n,vis[maxn],d[maxn];
double sum,power, rate;
vector<int> v[maxn];
void dfs(int i, int t)
{
if(d[i]){sum=sum+power*pow((100-rate)/100,t)*d[i];}
if(v[i].empty()) return;
for(int j=0;j<v[i].size();j++)
{
if (!vis[v[i][j]])
{
vis[v[i][j]]=1;
dfs(v[i][j],t+1);
}
}
}
int main()
{
cin>>n>>power>>rate;
memset(vis,0,sizeof(vis));
for (int i=0;i<n;i++)
{
int t,k;
cin>>t;
if (t!=0){for(int j=0;j<t;j++) {cin>>k;v[i].push_back(k);}}
else {cin>>k;d[i]=k;}
}
dfs(0,0);
int ans=sum;
cout<<ans<<endl;
return 0;
}
7-13 非常弹的球 (30分)
刚上高一的森森为了学好物理,买了一个“非常弹”的球。虽然说是非常弹的球,其实也就是一般的弹力球而已。森森玩了一会儿弹力球后突然想到,假如他在地上用力弹球,球最远能弹到多远去呢?他不太会,你能帮他解决吗?当然为了刚学习物理的森森,我们对环境做一些简化:
- 假设森森是一个质点,以森森为原点设立坐标轴,则森森位于(0, 0)点。
- 小球质量为w/100 千克(kg),重力加速度为9.8米/秒平方(m/s2)。
- 森森在地上用力弹球的过程可简化为球从(0, 0)点以某个森森选择的角度ang (0<ang<π/2) 向第一象限抛出,抛出时假设动能为1000 焦耳(J)。
- 小球在空中仅受重力作用,球纵坐标为0时可视作落地,落地时损失p%动能并反弹。
- 地面可视为刚体,忽略小球形状、空气阻力及摩擦阻力等。
森森为你准备的公式:
- 动能公式:E=m×v2/2
- 牛顿力学公式:F=m×a
- 重力:G=m×g
其中:
- E - 动能,单位为“焦耳”
- m - 质量,单位为“千克”
- v - 速度,单位为“米/秒”
- a - 加速度,单位为“米/秒平方”
- g - 重力加速度
输入格式:
输入在一行中给出两个整数:1≤w≤1000 和 1≤p≤100,分别表示放大100倍的小球质量、以及损失动力的百分比p。
输出格式:
在一行输出最远的投掷距离,保留3位小数。
输入样例:
100 90
输出样例:
226.757
#include<bits/stdc++.h>
using namespace std;
//m=w/100;
//E=m*v*v/2=w*v*v/200=1000
//F=m*a=w/100*a
//G=w/100*9.8
const double minn=1e-6;
int main()
{
double w,p,v,maxx=0;
cin>>w>>p;
v=1000*200/w; //v表示v的平方
while(v>minn)
{
maxx+=v/9.8; //距离
v=v*(1-p*0.01); //动能损失
}
printf("%.3f\n",maxx);
return 0;
}
7-14 周游世界 (30分)
周游世界是件浪漫事,但规划旅行路线就不一定了…… 全世界有成千上万条航线、铁路线、大巴线,令人眼花缭乱。所以旅行社会选择部分运输公司组成联盟,每家公司提供一条线路,然后帮助客户规划由联盟内企业支持的旅行路线。本题就要求你帮旅行社实现一个自动规划路线的程序,使得对任何给定的起点和终点,可以找出最顺畅的路线。所谓“最顺畅”,首先是指中途经停站最少;如果经停站一样多,则取需要换乘线路次数最少的路线。
输入格式:
输入在第一行给出一个正整数N(≤100),即联盟公司的数量。接下来有N行,第i行(i=1,⋯,N)描述了第i家公司所提供的线路。格式为:
M S[1] S[2] ⋯ S[M]
其中M(≤100)是经停站的数量,S[i](i=1,⋯,M)是经停站的编号(由4位0-9的数字组成)。这里假设每条线路都是简单的一条可以双向运行的链路,并且输入保证是按照正确的经停顺序给出的 —— 也就是说,任意一对相邻的S[i]和S[i+1](i=1,⋯,M−1)之间都不存在其他经停站点。我们称相邻站点之间的线路为一个运营区间,每个运营区间只承包给一家公司。环线是有可能存在的,但不会不经停任何中间站点就从出发地回到出发地。当然,不同公司的线路是可能在某些站点有交叉的,这些站点就是客户的换乘点,我们假设任意换乘点涉及的不同公司的线路都不超过5条。
在描述了联盟线路之后,题目将给出一个正整数K(≤10),随后K行,每行给出一位客户的需求,即始发地的编号和目的地的编号,中间以一空格分隔。
输出格式:
处理每一位客户的需求。如果没有现成的线路可以使其到达目的地,就在一行中输出“Sorry, no line is available.”;如果目的地可达,则首先在一行中输出最顺畅路线的经停站数量(始发地和目的地不包括在内),然后按下列格式给出旅行路线:
Go by the line of company #X1 from S1 to S2.
Go by the line of company #X2 from S2 to S3.
......
其中Xi
是线路承包公司的编号,Si
是经停站的编号。但必须只输出始发地、换乘点和目的地,不能输出中间的经停站。题目保证满足要求的路线是唯一的。
输入样例:
4
7 1001 3212 1003 1204 1005 1306 7797
9 9988 2333 1204 2006 2005 2004 2003 2302 2001
13 3011 3812 3013 3001 1306 3003 2333 3066 3212 3008 2302 3010 3011
4 6666 8432 4011 1306
4
3011 3013
6666 2001
2004 3001
2222 6666
输出样例:
2
Go by the line of company #3 from 3011 to 3013.
10
Go by the line of company #4 from 6666 to 1306.
Go by the line of company #3 from 1306 to 2302.
Go by the line of company #2 from 2302 to 2001.
6
Go by the line of company #2 from 2004 to 1204.
Go by the line of company #1 from 1204 to 1306.
Go by the line of company #3 from 1306 to 3001.
Sorry, no line is available.
7-15 球队“食物链” (30分)
某国的足球联赛中有N支参赛球队,编号从1至N。联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场。
联赛战罢,结果已经尘埃落定。此时,联赛主席突发奇想,希望从中找出一条包含所有球队的“食物链”,来说明联赛的精彩程度。“食物链”为一个1至N的排列{ T1 T2 ⋯ T**N },满足:球队T1战胜过球队T2,球队T2战胜过球队T3,⋯,球队T(N−1)战胜过球队T**N,球队T**N战胜过球队T1。
现在主席请你从联赛结果中找出“食物链”。若存在多条“食物链”,请找出字典序最小的。
注:排列{ a1 a2 ⋯ a**N}在字典序上小于排列{ b1 b2 ⋯ b**N },当且仅当存在整数K(1≤K≤N),满足:a**K<b**K且对于任意小于K的正整数i,a**i=b**i。
输入格式:
输入第一行给出一个整数N(2≤N≤20),为参赛球队数。随后N行,每行N个字符,给出了N×N的联赛结果表,其中第i行第j列的字符为球队i在主场对阵球队j的比赛结果:W
表示球队i战胜球队j,L
表示球队i负于球队j,D
表示两队打平,-
表示无效(当i=j时)。输入中无多余空格。
输出格式:
按题目要求找到“食物链”T1 T2 ⋯ T**N,将这N个数依次输出在一行上,数字间以1个空格分隔,行的首尾不得有多余空格。若不存在“食物链”,输出“No Solution”。
输入样例1:
5
-LWDW
W-LDW
WW-LW
DWW-W
DDLW-
输出样例1:
1 3 5 4 2
输入样例2:
5
-WDDW
D-DWL
DD-DW
DDW-D
DDDD-
输出样例2:
No Solution