【东莞市选2007】格斗俱乐部

Description
  格斗俱乐部是格斗爱好者的一个组织,在这里,格斗者们能通过与别的成员进行格斗来释放自己的压力与轻松自己的情绪。最近俱乐部举行了一场比赛,该比赛有N位选手参加,他们将围成一个圆圈,每一场比赛圈内任意的两位相邻的选手均可进行相互的格斗,胜利者将留在圈内进入下轮比赛而失败者则直接被送往医院(没有平局)。比赛是残酷的,最后圈内将只剩下一位选手,他将是总冠军。
  我们做个奇怪的假设,两位选手进行格斗,他们比赛的结果总是确定的。虽然俱乐部的成员们都很喜欢格斗,但是他们仍然很希望能获得总冠军。现在你通过统计已经知道了任意两位选手格斗的结果,你有责任告诉每位选手,如果赛程合适安排的话,他是否可能成为总冠军。

Input
  数据第一行是一个整数N,(1<=N<=40),表示比赛的选手数量。接下来给出一个N*N的“0”、“1”矩阵A(行内用空格隔开),第i行第j列为 1表示选手i能战胜选手j,否则选手j能战胜选手i。你可以假定Aij与Aji(i≠j)均是不同的且Aii=0。比赛开始时所有选手按顺时针方向由编号1到编号N站成一个圈,初始时编号1与编号N的选手是相邻的。

Output
  输出包含N行,每行为一个整数“0”或“1”,“1”表示第i号选手有可能成为冠军,“0”表示不可能。

Sample Input
3
0 1 1
0 0 1
0 0 0

Sample Output
1
0
0

思路:
在这里插入图片描述
附代码实现:

#include<cstdio>
#include<cstring>
using namespace std;
const int N=1005;
int n,s[N];
bool f[N][N],g[N][N];
int main() {
	memset(f,0,sizeof f);
	memset(g,0,sizeof g);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			scanf("%d",&g[i][j]);
	for(int i=1;i<=2*n;i++) {
		f[i][i+1]=1;
		s[i]=i-(i>n)*n;
	}
	for(int l=1;l<=n;l++) {
		for(int i=1;i+l<=2*n;i++) {
			int j=i+l;
			for(int k=i+1;k<j;k++) {
				if(f[i][k]&&f[k][j]) {
					if(g[s[i]][s[k]]||g[s[j]][s[k]]) {
						f[i][j]=1;
						break;
					}
				}
			}
		}
	}
	for(int i=1;i<=n;i++) printf("%d\n",f[i][i+n]);
}

半壕春水一城花,烟雨暗千家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值