CSP_202206-2_寻宝!大冒险!
Published on 2022-09-02 21:12 in CSP_202206-2_寻宝!大冒险! with dutrmp19

CSP_202206-2_寻宝!大冒险!

CSP_202206-2_寻宝!大冒险

题目链接

思路

相当于判断两个有限集合AB之间是不是满射和单射,只需要保证以下两点

  1. A和B元素个数相等
  2. A中每个元素都能通过映射ψ到B中一个元素,且ψ(a1)=ψ(a2)a1=a2

输入的矩阵格式和我们平常看到的坐标系,xy轴是反过来的

#include<iostream>
using namespace std;
int main() {
int n, L, S;
scanf("%d%d%d", &n, &L, &S);
int A[n][2];
int B[S+1][S+1];
int t_in_b = 0, ans = 0; // number of trees in B
for (int i = 0; i < n; i++) {
scanf("%d%d", &A[i][0], &A[i][1]);
}
for (int i = 0; i < S+1; i++) {
for (int j = 0; j < S+1; j++) {
scanf("%d", &B[S-i][j]);
if (B[S-i][j] == 1) t_in_b++;
}
}
for (int i = 0; i < n; i++) {
// tree out of B
if (A[i][0] + S > L || A[i][1] + S > L) {
continue;
}
//
int t_in_a = 0;
for (int j = 0; j < n; j++) {
int x = A[j][0] - A[i][0];
int y = A[j][1] - A[i][1];
if (0 <= x && x <= S && 0 <= y && y <= S) t_in_a += 1;
}
if (t_in_a != t_in_b) continue; // tree num not same
bool flag = true;
for (int j = 0; j < n; j++) {
int m = A[j][0] - A[i][0];
int n = A[j][1] - A[i][1];
if (0 <= m && m <= S && 0 <= n && n <= S){
if (B[m][n] == 1) continue;
else {
flag = false;
break;
}
}
}
if (flag) ans += 1;
else continue;
}
printf("%d", ans);
return 0;
}

如果您有任何关于文章的建议,欢迎评论或在 GitHub 提 PR

作者:dutrmp19
本文为作者原创,转载请在 文章开头 注明出处:https://www.cnblogs.com/dutrmp19/p/16651248.html
遵循 CC 4.0 BY-SA 版权协议


posted @   dutrmp19  阅读(270)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示