1 条题解
-
0
自动搬运
来自洛谷,原作者为

2021zjhs005
又是元气满满的一天。搬运于
2025-08-24 22:54:54,当前版本为作者最后更新于2024-02-03 19:38:13,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
这是一道强大的
if语句题,难度大概为橙。Despriction
给定一个 的“井”自行棋盘,求每一行、每一列、每一对角线中,不同的全部相等的和 个相等的出现的次数。
Solution
直接枚举每一行、每一列、每一对角线,然后判断即可。
这时因为大量重复代码不太美观,所以可以自定义一个 函数。 分别表示当前行或列或对角线的 个元素。
-
如果 ,这时对答案一的贡献为 。
-
如果 中有两个相等,那么对答案二的贡献为 。
但是这题也有坑点,不仔细看清题目的可能会掉进去。
比如:
Input: ABA BAB ABA Output: 1 1这是因为题目求的是不同的奶牛的数量,相同的可能会造成 次,或者更多贡献,然而实际只算 次。
开两个
map,第一个 表示 已经对答案一作出贡献,反之,则没有对答案一做出贡献。第二个 ,表示 组队已经对答案二做出贡献,反之,则没有。
判断条件就变成了:
-
如果 ,这时对答案一的贡献为 。
-
如果 中有两个相等,并且相等的 满足 ,那么对答案二的贡献为 。
Code
#include <bits/stdc++.h> using namespace std; #define int long long #define rep(i,x,y) for(int i=x;i<=y;i++) #define rrep(i,x,y) for(int i=x;i>=y;i--) #define sc scanf #define pr printf inline int read(){int s=0,w=1;char c=getchar();while(!isdigit(c)){if(c=='-') w=-1;c=getchar();}while(isdigit(c)){s=(s<<1)+(s<<3)+(c^48);c=getchar();}return s*w;} int ans1,ans2; char a[4][4]; map <char,bool> f,f1[100]; inline char min(char a,char b){ return a<b?a:b; } inline char max(char a,char b){ return a>b?a:b; } inline void judge(char cow1,char cow2,char cow3){ if(cow1==cow2&&cow2==cow3){//三个都相等。 if(!f[cow1]){//没有重复,则对答案一贡献加 1。 ans1++; f[cow1]=1; } } else if(!(cow1!=cow2&&cow1!=cow3&&cow2!=cow3)){//如果不是两两不同,那么只有三个都相同或者有两个相同。因为 else 否决了一个,所以只剩下两个相同的情况。 char c1=min(cow1,min(cow2,cow3)),c2=max(cow1,max(cow2,cow3));//比最小值和最大值,方便查找不同的元素。 if(!f1[c1][c2]&&!f1[c2][c1]){//没有重复,则对答案二的贡献加 1。 ans2++; f1[c1][c2]=f1[c2][c1]=1; } } } signed main(){ rep(i,1,3) rep(j,1,3) cin>>a[i][j]; rep(i,1,3){ judge(a[i][1],a[i][2],a[i][3]);//行。 //------------------------------- judge(a[1][i],a[2][i],a[3][i]);//列。 } judge(a[1][1],a[2][2],a[3][3]); judge(a[1][3],a[2][2],a[3][1]);//对角线。 pr("%lld\n%lld\n",ans1,ans2); return 0; } -
- 1
信息
- ID
- 9768
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者