Description |
平行世界是动漫作品中经常涉及的题材,而且往往这些作品都相当的精彩,如《寒蝉鸣泣之时》、《CLANNAD》、《魔法少女小圆》、《命运石之门》等。世界从诞生到结束,最终又轮回到诞生。无论命运如何的绝对,在无数次的轮回中终将被打破,犹如掷骰子,在无限接近于零但不等于零的机率中往复。这样在无限的反复和轮回中,将其可能性放大到100%。最典型的人物就是《海猫鸣泣之时》中的能无限次引发奇迹力量的“奇迹之魔女”贝伦卡斯泰露。而与此对应的是能够让事件发生的可能性无限接近于零“绝对的魔女”拉姆达戴露塔。在故事中,贝伦的目的是为了令主角战人在黄金魔女的游戏中“赢”,而拉姆达的目的则是为了让游戏永远“平局”下去。 |
Input |
有多组数据,第一行是一个整数n表示事件的数目。(2<=n<=100) |
Output |
对于每组测试数据,第一行输出一个k表示有多少个人物可能获胜,接下来的k行每行输出一个人物的编号,编号从小到大输出。 |
Sample Input |
3 2
0 0 1 0 |
Sample Output |
3 |
思路:和lrj的例题决斗思路一样,meet[i,j]表示是否有可能i和j相遇, 则第i个人能取得最后的胜利当且仅当meet[i,i]为true.如果i最后能碰到自己,即她能存留下来
#include<stdio.h>
#include<string.h>
int meet[103][103], d[103][103];
int main()
{
int n, i, t, j, k, mm;
while(scanf("%d", &n)!=EOF)
{
memset(d, 0, sizeof(d));
memset(meet, 0, sizeof(meet));
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
scanf("%d", &mm);
if(mm==1)
d[i][j]=1;
}
}
for(i=0; i<n-1; i++)
meet[i][i+1]=1, meet[i+1][i]=1;
meet[0][n-1]=1, meet[n-1][0]=1;
int flag;
for(t=2; t<=n; t++)
for(i=0;i<n;i++)
{
j=(i+t)%n;
flag=0;
for(k=(i+1)%n; k!=j; k=(k+1)%n)
{
if(meet[i][k]&&meet[k][j]&&(1==d[i][k]||1==d[j][k]))
{
meet[i][j]=1;
flag=1;
break;
}
}
if(!flag)
meet[i][j]=0;
}
int num=0;
for(i=0; i<n; i++)
if(meet[i][i])
num++;
printf("%d\n", num);
for(i=0; i<n; i++)
if(meet[i][i])
printf("%d\n", i+1);
}
return 0;
}