AcWing.5150. 顶牛

发布时间 2023-09-21 03:24:28作者: neKo333

AcWing.5149.简单计算

约翰的农场有\(n\)头奶牛,编号 \(1∼n\)
为了决出谁才是牛中强者,它们之间决定来一场顶牛大赛。
已知,每两头奶牛之间都会有一场一对一对决,对决可能产生以下几种结果:没有牛被顶翻、一头牛被顶翻、两头牛都被顶翻。
所有对决的结果已经用一个 \(n×n\) 的整数矩阵 \(A\) 记录了下来。
矩阵中第 \(i\) 行第 \(j\) 列的数字\(Aij\) 用来描述奶牛 \(i\) 和奶牛 \(j\) 之间的对决结果,\(Aij\) 可能有以下几种取值:

  • \(−1\):当且仅当 \(i=j\) 时,\(Aij=−1\) 成立。无实际意义,毕竟一头牛不会自己顶自己。
  • \(0\):表示两头奶牛都没有被对方顶翻。
  • \(1\):表示奶牛 \(i\) 被顶翻了。
  • \(2\):表示奶牛 \(j\) 被顶翻了。
  • \(3\):表示奶牛 \(i\) 和奶牛 \(j\) 都被顶翻了。
    矩阵记录的结果一定是正确的,不会出现自相矛盾的地方。
    也就是说,若 \(Aij=1\),则 \(Aji=2\) ;若 \(Aij=3\),则 \(Aji=3\);若 \(Aij=0\),则 \(Aji=0\)
    如果一头奶牛在所有对决中从未被顶翻过,那么这头奶牛就被认为是一头强牛。
    请你统计所有奶牛中一共有多少个强牛以及哪些牛是强牛。

输入格式

第一行包含一个整数 \(n\)

接下来 \(n\)行,每行包含 \(n\) 个整数,其中第 \(i\) 行第 \(j\) 列的整数表示 \(Aij\)

输出格式

首先输出一行一个整数,表示强牛的数量。
如果强牛的数量为 \(0\),则输出结束。
如果强牛的数量不为 \(0\),则在第二行按照编号升序的顺序输出所有强牛的编号。

数据范围

前 33 个测试点满足 \(1≤n≤41\)
所有测试点满足 \(1≤n≤100\)\(−1≤Aij≤3\)

输入样例:

3
7 5 12345
5 0 4
10 5 15

输出样例:

3
-1 0 0
0 -1 1
0 2 -1
思路分析:设置一个判断数组st和计数cnt,循环读入n*n个数,对每个数判断,如果读入的数字为1或3,则第i个牛被顶翻,st[i]=true,cnt++;如果读入的数字为2或者3,则第j个牛被顶翻,st[j]=true,cnt++;读入-1,0不进行操作,直到读完数字。输出最强壮的牛的数量cnt,最后遍历st数组,输出最强壮的牛。
代码:
#include<iostream>
using namespace std;
const int N=110;
bool st[N];
int n,x,cnt;
int main(){
    cin>>n;
    for(int i = 0;i < n;i++){
        for(int j = 0;j < n;j++){
            cin>>x;
            if( x==1 || x==3) st[i] = true,cnt++;
            if( x==2 || x==3) st[j] = true,cnt++;
        }
    }
    cout<<cnt<<endl;
    for(int i = 0;i < n;i++){
        if(!st[i]) cout<< i + 1<<' ';
    }
    return 0;
}