| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2227 人关注过本帖
标题:寻找平面上的极大点
只看楼主 加入收藏
李正祥
Rank: 1
等 级:新手上路
帖 子:15
专家分:3
注 册:2013-4-15
结帖率:0
收藏
 问题点数:0 回复次数:6 
寻找平面上的极大点
网上提交上去总是错误 跪求指点
描述
在一个平面上,如果有两个点(x,y),(a,b),如果说(x,y)支配了(a,b),这是指x>=a,y>=b;
用图形来看就是(a,b)坐落在以(x,y)为右上角的一个无限的区域内。
给定n个点的集合,一定存在若干个点,它们不会被集合中的任何一点所支配,这些点叫做极大值点。
编程找出所有的极大点,按照x坐标由小到大,输出极大点的坐标。
本题规定:n不超过100,并且不考虑点的坐标为负数的情况。
输入
输入包括两行,第一行是正整数n,表示是点数,第二行包含n个点的坐标,坐标值都是整数,坐标范围从0到100,输入数据中不存在坐标相同的点。
输出
按x轴坐标最小到大的顺序输出所有极大点。
输出格式为:(x1,y1),(x2,y2),...(xk,yk)
注意:输出的每个点之间有","分隔,最后一个点之后没有",",少输出和多输出都会被判错
样例输入
5
1 2 2 2 3 1 2 3 1 4

这是我的代码!!网上提交上去总是错误 跪求指点
#include<iostream>
using namespace std;

struct point
{
 int x;
 int y;
}p[200];

int main()
{
     int n;
     int i=0;
     int j=0;
     int count=0;
     struct point temp;
     cin>>n;

     for(i=0;i<n;i++)
      cin>>p[i].x>>p[i].y;//输入
    int teg = 0;
    for(i = n - 1; i >= 1; i--){
        teg = 0;
        for(j = 0; j < i; j++){
            if(p[i].x < p[j+1].x){
                temp = p[i];
                p[i] = p[j+1];
                p[j+1] = temp;
                teg = 1;
            }
        }
        if(teg == 0)
            break;
    }
     for(i=0;i<n;i++)
     {
          int flag = 1;/*设置一个标志flag,若该点被其它任意一点支配,则在以下循环中被置为false*/
          for(j=0;j<n;j++)
          {
               if(j==i)//避免该点与自己做比较
            continue;//跳过本次循环
               if(p[i].x<=p[j].x && p[i].y<=p[j].y)
               {
                flag=0;
                break;/*如果该点被其它任意一点所支配,则立即跳出循环,并且将flag置为false*/
               }
        }
        if(flag)/*如果循环结束,且flag仍然为true,则说明该点是极大点,应该输出该点*/
        {
               count++;
               if(count>1)//用于正确输出逗号
            cout<<',';
               cout<<"("<<p[i].x<<","<<p[i].y<<")";
       }
     }   
     cout<<endl;
 
    return 0;
}
搜索更多相关主题的帖子: 正整数 平面 网上 
2013-12-30 14:39
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
你这个teg是做什么的,没看懂


[fly]存在即是合理[/fly]
2013-12-30 15:49
李正祥
Rank: 1
等 级:新手上路
帖 子:15
专家分:3
注 册:2013-4-15
收藏
得分:0 
回复 2楼 azzbcc
冒泡排序,一起都不交换说明已经排好序了,跳出循环不需要排序!!!
2013-12-30 18:18
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
你这排序只考虑了x,那y情何以堪。

我不知道其他人是不是也和你一个思路。送你们一段代码先看看能不能理解。

程序代码:
#include<stdio.h>

int output(int * a, int x, int max)
{
    if(x < 0) return 0;
    if(a[x] > max)
    {
        if(output(a, x - 1, a[x])) putchar(',');
        printf("(%d,%d)", x, a[x]);
        return 1;
    }
    return output(a, x - 1, max);
}

int main()
{
    int a[101], n, x, y, i;
    for(i = 0; i <= 100; a[i++] = -1);
    for(scanf("%d", &n), i = 0; i < n; i++)
    {
        scanf("%d%d", &x, &y);
        if(a[x] < y) a[x] = y;
    }
    output(a, 100, -1);
    return 0;
}

重剑无锋,大巧不工
2013-12-30 18:39
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
回复 3楼 李正祥
这不是冒泡排序,你的两个循环也实现不了排序


[fly]存在即是合理[/fly]
2013-12-30 20:41
李正祥
Rank: 1
等 级:新手上路
帖 子:15
专家分:3
注 册:2013-4-15
收藏
得分:0 
回复 4楼 beyondyf
谢谢!!!
2014-01-11 21:22
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
一直没看出这道题的考点是什么

我的算法是:
以 1 2 2 2 3 1 2 3 1 4 为例,先进行排序得 (3,1) (2,3) (2,2) (1,4), (1,2) (排序规律是:y大的排前面,若y相当,则x大的排前面。)
第一点(3,1) 肯定是第一个极大点(因为没有任何坐标的y大于第一个点,若有坐标相等的坐标,x又不比其更大)
找到随后x坐标大于第一个极大点的坐标,即找到(2,3),(2,3)为第二个极大点
找到随后x坐标大于第二个极大点的坐标,即找到(1,4),(1,4)为第三个极大点
……

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int compare( const void* a, const void* b )
{
    int ay = ((const int*)a)[1];
    int by = ((const int*)b)[1];
    if( ay > by ) return -1;
    if( ay < by ) return +1;

    int ax = ((const int*)a)[0];
    int bx = ((const int*)b)[0];
    return bx-ax;
}

int main()
{
    int n;
    int coords[100];

    // 输入
    scanf( "%d", &n );
    for( int i=0; i<n; ++i )
        scanf( "%d%d", &coords[2*i+0], &coords[2*i+1] );
    // 排序
    qsort( coords, n, sizeof(int[2]), &compare );
    // 输出
    for( int i=0, x=INT_MIN; i<n; ++i )
    {
        if( coords[2*i+0] <= x )
            continue;

        printf( "%s(%d,%d)", ","+(i==0), coords[2*i+0], coords[2*i+1] );
        x = coords[2*i+0];
    }

    return 0;
}

2014-01-14 12:04
快速回复:寻找平面上的极大点
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021530 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved