King of the Waves

You are organising a king of the hill tournament, the Buenos Aires Paddleboarding Competition (BAPC), with n participants. In a king of the hill tournament, one person starts as a “king” and is then challenged by another person, the winning person becomes the new king. This is repeated until all participants have challenged exactly once (except for the starting person). In a paddle- boarding match, there are no draws. The person which ends up as king, wins the tournament. Since you are the organiser, you get to choose the starting person and the order in which they challenge the king.

Someone is offering you a substantial amount of money in case one of the participants, Henk, ends up winning the tournament. You happen to know, for any two participants x and y, which of the two would win if they were to match during the tournament. Consequently, you choose to do the unethical: you will try to rig the game. Can you find a schedule that makes Henk win the tournament?

Input

  • The first line contains an integer 1 ≤ n ≤ 1000, the number of participants. The participants are numbered 0, . . . , n − 1, where Henk is 0.
  • Then n lines follow, where each line has exactly n characters (not counting the newline character). These lines represent the matrix with the information of who beats who, as follows. On line i the jth character is (note that 0 ≤ i, j < n):
    • '1' if person i will win against person j.
    • '0' if person i will lose against person j.
    • 'X' if i = j.

Output

Print a sequence of participants, such that the first person starts as king and the consequent participants challenge the king. If there is no way to rig the game such that Henk wins, print "impossible".

本题答案不唯一,符合要求的答案均正确

#include <bits/stdc++.h>

using namespace std;
bool mapp[2000][2000],visit[2000],flag;
int match[2000],n,t;
void dfs(int u)
{
   if(t==n-1){
       flag=true;
       return;
   }
   else{
       for(int v=0;v<n;v++){
        if(mapp[u][v]&&!visit[v]){
            visit[v]=true;
            match[t++]=v;
            dfs(v);
        }
       }
   }
   return;
}

int main(){
    ios::sync_with_stdio(false);
    char a,b;
    cin>>n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(i==j) cin>>a;
            else{
                cin>>b;
                if(b=='1') mapp[i][j]=true;
            }
        }
    }
    visit[0]=true;
    dfs(0);
    if(!flag) cout<<"impossible"<<endl;
    else{
        for(int i=t-1;i>=0;i--) cout<<match[i]<<" ";
        cout<<0<<endl;
    }
}
View Code

题解:我觉得讲的很明白https://blog.csdn.net/qq_38140099/article/details/79847646

主要是不一定要谁打败谁

打不赢也是可以的

转载于:https://www.cnblogs.com/smallocean/p/8747562.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值