
思路: #
首先看题,让我们求迷宫 $m$ 可以直接到达其他的迷宫有多少个,有多少迷宫可以直接到达 $m$ 号迷宫,和这些迷宫的总和。
先看迷宫 $m$ 可以直接到达其他的迷宫,是什么意思呢?
其实就是让我们看当历遍的迷宫是 $m$ 时有多少个为真。
由此得出代码:
for(int i=1;i<=n;i++){
if(jz[m][i]==1){ // 我们只用查看 m 迷宫有多少个 1
sum1++;
}
}
然后我们看多少迷宫可以直接到达 $m$ 号迷宫,这又是什么意思呢?
其实就是查看有多少个迷宫的 $m$ 也就是 $jz[i][m]$ 为真。
由此得出代码:
for(int i=1;i<=n;i++){
if(jz[i][m]==1)sumzj++;
}
让我们看一下这两份代码循环的条件是不是相同的?
是对吧,由此合并两份代码:
for(int i=1;i<=n;i++){
if(jz[m][i]==1){
sum1++;
}
if(jz[i][m]==1)sumzj++;
}
最后看这些迷宫的总和,没有坑直接输出就行。
完整代码 #
#include<bits/stdc++.h>
using namespace std;
bool jz[1001][1001];
long long sumzj;
long long sum1;
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>jz[i][j];
}
}
for(int i=1;i<=n;i++){
if(jz[m][i]==1){
sum1++;
}
if(jz[i][m]==1)sumzj++;
}
cout<<sum1<<" "<<sumzj<<" "<<sum1+sumzj;
return 0;
}