鱼C论坛

 找回密码
 立即注册
查看: 2308|回复: 11

监视奶牛

[复制链接]
发表于 2022-7-8 09:15:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
枚举监视线在XXX, YYY, XYY, YYX 四种情况 , 但是具体代码应该怎么写 , 求教
输入:

  1. 6
  2. 1 7
  3. 0 0
  4. 1 2
  5. 2 0
  6. 1 4
  7. 3 4
复制代码

输出:
  1. 1
复制代码
屏幕截图 2022-07-08 091252.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-7-8 09:45:15 | 显示全部楼层
本帖最后由 柿子饼同学 于 2022-7-8 10:37 编辑


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-8 11:04:32 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-8 15:27:57 | 显示全部楼层
本帖最后由 jhq999 于 2022-7-8 15:31 编辑


看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-8 15:45:40 | 显示全部楼层
没看明白题目说的是什么意思。能不能给翻译一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-8 17:24:32 | 显示全部楼层
顶级太阳 发表于 2022-7-8 15:45
没看明白题目说的是什么意思。能不能给翻译一下。

就是在一个平面里, 给出所有牛的坐标
现在有三个线 ,可以垂直也可以平行于 x 轴
问能否用这三根线串起所有的牛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-7-8 20:38:54 | 显示全部楼层
不太理解你描述的 XXX、YYY、XYY、YYX 四种情况是什么意思。
光看题目本身,应该不太难。

我的思路:
坐标 (x, y)                x行y列
任选一个方向轴(x或y),给所有坐标的不同数值计算一个权值 n,选择 x轴就计算 x的坐标,选择 y轴则计算 y坐标

以选择 x轴,输入数据同楼主输入为例:1的权值为 3,0的权值为 1,2的权值为 1,3的权值为 1。

从权值n>1的数值中,由大到小放线。(可设跳出条件:三条线已用完)
故在y=1放线,此时剩余两条线,且 x轴方向不再有权值n>1的坐标

进入下一阶段
遍历剩余坐标的 y值,计算 y的不同值个数,此例中剩余 y值有 0|4 两个,将该个数与剩余 线 的条数进行对比,满足小于等于条件,即可成功,返回 1;反之 返回 0.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-9 09:07:25 | 显示全部楼层
给你个证伪的办法,只要有4个点相互不在同一直线的就是伪
例如:
0,0
1,3
2,1
4,5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-17 17:19:11 | 显示全部楼层
风车呼呼呼 发表于 2022-7-8 20:38
不太理解你描述的 XXX、YYY、XYY、YYX 四种情况是什么意思。
光看题目本身,应该不太难。

根据您的思路写的代码 , 但是跑不对 , 求指教
  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. int n, px, py, linecount = 0;
  4. map<int, bool> vis;
  5. map<int, vector<int> > mpx; // x 相同的就记下点的号码

  6. int main(){
  7.     ios::sync_with_stdio(0);
  8.     cin.tie(0); cout.tie(0);
  9.    
  10.     cin >> n;
  11.     for(int i = 0; i < n; i++){
  12.         cin >> px >> py;
  13.         mpx[px].push_back(i); // 用 i 作为每个点的号
  14.     }

  15.     for(auto i = mpx.begin(); i != mpx.end(); i++){
  16.         if(i->second.size() > 1){
  17.             linecount++;
  18.             for(auto j : i->second){
  19.                 vis[j] = 1; // 打访问标记
  20.             }
  21.         }
  22.         if(linecount > 3){
  23.             cout << 0 << endl;
  24.             return 0;
  25.         }
  26.     }

  27.     int cnt = 0;
  28.     for(int i = 0; i < n; i++){
  29.         if(!vis[i]) cnt++; // 没用过就加
  30.     }
  31.     if(linecount + cnt <= 3) cout << 1 << endl;
  32.     else cout << 0 << endl;
  33.    
  34.     return 0;
  35. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-7-17 17:19:54 | 显示全部楼层
jhq999 发表于 2022-7-9 09:07
给你个证伪的办法,只要有4个点相互不在同一直线的就是伪
例如:
0,0

谢谢回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-26 00:52:30 | 显示全部楼层
你好,我是学C的新人,就用C写了个关于你这题的代码,有亿点冗长,不知道对不对,求指教!
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         printf("请输入牛的数量:");
  5.         int n,xMax,xMin,yMax,yMin,count_x=0,count_y=0,z=0,p=0,s=0,t=0,u,v;
  6.        
  7.         bool flag=0;
  8.         scanf("%d",&n);
  9.         printf("请输入每头牛的坐标(每行1组,用空格隔开):\n");
  10.         int x[n],y[n],Ax[n]={0},Ay[n]={0},X[n],Y[n];
  11.         for(int count=0;count<n;count++)
  12.         {
  13.                 scanf("%d %d",&x[count],&y[count]);
  14.         }
  15.         /*for(int a=0;a<n;a++)
  16.         {
  17.                 printf("%d %d\n",x[a],y[a]);
  18.         }*/
  19.         xMax=x[0];
  20.         yMax=y[0];
  21.         xMin=x[0];
  22.         yMin=y[0];
  23.         for(int b=1;b<n;b++)
  24.         {
  25.                 xMax=(x[b]>xMax)?x[b]:xMax;
  26.                 xMin=(x[b]>xMin)?xMin:x[b];
  27.                 yMax=(y[b]>yMax)?y[b]:yMax;
  28.                 yMin=(y[b]>yMin)?yMin:y[b];
  29.         }
  30.         bool plane[xMax-xMin+1][yMax-yMin+1]={0};
  31.         for(int c=0;c<n;c++)
  32.         {
  33.                 plane[x[c]-xMin][y[c]-yMin]=1;
  34.         }
  35.         for(int d=0;d<xMax-xMin+1;d++)//每个余子式一个循环
  36.         {
  37.                 for(int e=0;e<yMax-yMin+1;e++)
  38.                 {
  39.                         bool plane_1[xMax-xMin+1][yMax-yMin+1];
  40.                         for(int f=0;f<xMax-xMin+1;f++)
  41.                         {
  42.                                 for(int g=0;g<yMax-yMin+1;g++)
  43.                                 {
  44.                                         plane_1[f][g]==plane[f][g];//复制平面
  45.                                 }
  46.                         }
  47.                         for(int i=0;i<yMax-yMin+1;i++)
  48.                         {
  49.                                 plane_1[d][i]=0;
  50.                         }
  51.                         for(int j=0;j<xMax-xMin+1;j++)
  52.                         {
  53.                                 plane_1[e][j]=0;//求出余子式
  54.                         }
  55.                         for(int k=0;k<xMax-xMin+1;k++)
  56.                         {
  57.                                 for(int l=0;l<yMax-yMin+1;l++)
  58.                                 {
  59.                                         if(plane_1[k][l])
  60.                                         {
  61.                                                 Ax[z]=k;//返回为点坐标
  62.                                                 Ay[z]=l;
  63.                                                 z++;
  64.                                         }
  65.                                 }
  66.                         }
  67.                         for(int m=0;m<z;m++)//判断剩余点是否在同一直线
  68.                         {
  69.                                 if(Ax[m]!=Ax[m+1])
  70.                                 {
  71.                                         for(int o=0;o<z;o++)
  72.                                         {
  73.                                                 if(Ay[o]!=Ay[o+1])
  74.                                                 {
  75.                                                         p++;
  76.                                                 }
  77.                                         }
  78.                                 }
  79.                         }
  80.                         if(p==z)
  81.                         {
  82.                                 continue;
  83.                         }
  84.                         else
  85.                         {
  86.                                 flag=1;
  87.                         }
  88.                 }
  89.                 if(flag)
  90.                 {       
  91.                         break;
  92.                 }
  93.         }
  94.         //case 3/4
  95.         for(int count_1=0;count_1<n;count_1++)
  96.         {
  97.                 if(!count_1)
  98.                 {
  99.                         X[count_1]=x[count_1];
  100.                         Y[count_1]=y[count_1];
  101.                         s++;
  102.                         t++;
  103.                 }
  104.                 else
  105.                 {
  106.                         for(u=0;u<s;u++)
  107.                         {
  108.                                 if(x[count_1]==X[u])
  109.                                 {
  110.                                         break;
  111.                                 }
  112.                         }
  113.                         if(u==s)
  114.                         {
  115.                                 s++;
  116.                         }
  117.                        
  118.                         for(v=0;v<t;v++)
  119.                         {
  120.                                 if(y[count_1]==Y[v])
  121.                                 {
  122.                                         break;
  123.                                 }
  124.                         }
  125.                         if(v==t)
  126.                         {
  127.                                 t++;
  128.                         }
  129.                 }
  130.         }
  131.         if((s<=3)||(t<=3))
  132.         {
  133.                 flag=1;
  134.         }
  135.         if(flag)
  136.         printf("1\n");
  137.         else
  138.         printf("0\n");
  139.         return 0;
  140. }
复制代码

(可能有错,大佬勿喷)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-26 00:53:57 | 显示全部楼层
额外减小 发表于 2022-7-26 00:52
你好,我是学C的新人,就用C写了个关于你这题的代码,有亿点冗长,不知道对不对,求指教!

(可能有错, ...

我个人认为,C和C++差不多(主观臆断),你可以将就着看看吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-29 00:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表