有个算法问题求教!想不出来!

libinden71 2016-09-03 09:34:49

今天有人给我出了个问题,愣是没想出来!给定2个长方形,怎么计算出他们的重合点x1,y1
...全文
369 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cocoabird 2016-09-14
  • 打赏
  • 举报
回复
给定的是什么呢?
赵4老师 2016-09-05
  • 打赏
  • 举报
回复
仅供参考:
//实现一个函数:求数轴上多个线段覆盖的区域对应的多个线段; 输入多个线段,求出被这些线段覆盖的所有区域(也用线段表示); 一条线段用两个值表示(x0,x1), 其中x1>x0;
//比如(1,3);(2,4);(5,6);结果为(1,4);(5,6);
//比如(1,3);(2,4);(5,6);(4,7);结果为(1,7);
#include <stdio.h>
#define MAXLINES 100
struct LINE {
    int x0;//左端
    int x1;//右端
} ls[MAXLINES];
int i,j,k,n,x0,x1,c;
void add() {
    if (0==n) {//加入第一对点
        ls[n].x0=x0;
        ls[n].x1=x1;
        n=1;
    } else {
        if (x1==ls[0].x0) {//右端=第一条线段的左端
            ls[0].x0=x0;//第一条线段的左端修改为左端
            return;
        }
        if (x1<ls[0].x0) {//右端<第一条线段的左端
            for (i=n-1;i>=0;i--) {//将所有线段往后移
                ls[i+1].x0=ls[i].x0;
                ls[i+1].x1=ls[i].x1;
            }
            ls[0].x0=x0;//新第一条线段为x0,x1
            ls[0].x1=x1;
            n++;
            return;
        }
        if (ls[n-1].x1<x0) {//左端>最后那条线段的右端
            ls[n].x0=x0;//新最后那条线段
            ls[n].x1=x1;
            n++;
            return;
        }
        if (x0<=ls[0].x0 && ls[n-1].x1<=x1) {//左端≤第一条线段的左端且最后那条线段的右端≤右端
            ls[0].x0=x0;//只剩这一条线段
            ls[0].x1=x1;
            n=1;
            return;
        }
        for (i=0;i<n;i++) {//从左到右依次检查每条线段
            if (ls[i].x0<=x0 && x0<=ls[i].x1) {//第i条线段的左端≤左端≤第i条线段的右端
                for (j=i;j<n;j++) {//从第i条线段开始从左到右依次检查每条线段
                    if (ls[j].x0<=x1 && x1<=ls[j].x1) {//第j条线段的左端≤右端≤第j条线段的右端
                        ls[i].x1=ls[j].x1;//第i条线段的右端改为第j条线段的右端
                        for (k=1;k<=n-j-1;k++) {//将剩余线段往前移
                            ls[i+k].x0=ls[j+k].x0;
                            ls[i+k].x1=ls[j+k].x1;
                        }
                        n-=j-i;
                        return;
                    }
                    if (ls[j].x1<x1 && (j==n-1 || x1<ls[j+1].x0)) {//第j条线段的右端<右端<第j+1条线段的左端(如果有)
                        ls[i].x1=x1;//第i条线段的右端改为右端
                        for (k=1;k<=n-j-1;k++) {//将剩余线段往前移
                            ls[i+k].x0=ls[j+k].x0;
                            ls[i+k].x1=ls[j+k].x1;
                        }
                        n-=j-i;
                        return;
                    }
                }
            }
            if (ls[i].x1<x0 && (i==n-1 || x0<ls[i+1].x0)) {//第i条线段的右端<左端<第i+1条线段的左端(如果有)
                if (i!=n-1 && x1<ls[i+1].x0) {//右端<第i+1条线段的左端(如果有)
                    for (k=n-1;k>=i+1;k--) {//将从第i+1条线段开始的所有线段往后移
                        ls[k+1].x0=ls[k].x0;
                        ls[k+1].x1=ls[k].x1;
                    }
                    ls[i+1].x0=x0;//新第i+1条线段为x0,x1
                    ls[i+1].x1=x1;
                    n++;
                    return;
                }
                for (j=i+1;j<n;j++) {//从第i+1条线段开始从左到右依次检查每条线段
                    if (ls[j].x0<=x1 && x1<=ls[j].x1) {//第j条线段的左端≤右端≤第j条线段的右端
                        ls[i+1].x0=x0;//第i+1条线段的左端改为左端
                        ls[i+1].x1=ls[j].x1;//第i+1条线段的右端改为第j条线段的右端
                        for (k=1;k<=n-j-1;k++) {//将剩余线段往前移
                            ls[i+1+k].x0=ls[j+k].x0;
                            ls[i+1+k].x1=ls[j+k].x1;
                        }
                        n-=j-i-1;
                        return;
                    }
                    if (ls[j].x1<x1 && (j==n-1 || x1<ls[j+1].x0)) {//第j条线段的右端<右端<第j+1条线段的左端(如果有)
                        ls[i+1].x0=x0;//第i+1条线段的左端改为左端
                        ls[i+1].x1=x1;//第i+1条线段的右端改为右端
                        for (k=1;k<n-j-1;k++) {//将剩余线段往前移
                            ls[i+k].x0=ls[j+k].x0;
                            ls[i+k].x1=ls[j+k].x1;
                        }
                        n-=j-i-1;
                        return;
                    }
                }
            }
            if (x0<ls[i].x0) {//左端<第i条线段的左端
                for (j=i;j<n;j++) {//从第i条线段开始从左到右依次检查每条线段
                    if (ls[j].x0<=x1 && x1<=ls[j].x1) {//第j条线段的左端≤右端≤第j条线段的右端
                        ls[i].x0=x0;//第i条线段的左端改为左端
                        ls[i].x1=ls[j].x1;//第i条线段的右端改为第j条线段的右端
                        for (k=1;k<=n-j-1;k++) {//将剩余线段往前移
                            ls[i+k].x0=ls[j+k].x0;
                            ls[i+k].x1=ls[j+k].x1;
                        }
                        n-=j-i;
                        return;
                    }
                    if (ls[j].x1<x1 && (j==n-1 || x1<ls[j+1].x0)) {//第j条线段的右端<右端<第j+1条线段的左端(如果有)
                        ls[i].x0=x0;//第i条线段的左端改为左端
                        ls[i].x1=x1;//第i条线段的右端改为右端
                        for (k=1;k<=n-j-1;k++) {//将剩余线段往前移
                            ls[i+k].x0=ls[j+k].x0;
                            ls[i+k].x1=ls[j+k].x1;
                        }
                        n-=j-i;
                        return;
                    }
                }
            }
        }
    }
}
void show() {
    for (i=0;i<n;i++) {
        printf("(%d,%d);",ls[i].x0,ls[i].x1);
    }
    printf("\n");
}
void main() {
    n=0;
    c=0;
    while (1) {
        printf("Input x0,x1(x0<x1;0,0 to exit):");
        fflush(stdout);
        rewind(stdin);
        if (2==scanf("%d,%d",&x0,&x1)) {
            if (0==x0&&0==x1) break;
            if (x1>x0) {
                c++;
                if (c>=MAXLINES) {
                    printf("Up to %d!\n",MAXLINES);
                    break;
                }
                add();
                show();
            }
        }
    }
}
赵4老师 2016-09-05
  • 打赏
  • 举报
回复
看似简单中蕴含着复杂。
paschen 2016-09-04
  • 打赏
  • 举报
回复
已知什么,如果这两个长方形各顶点坐标都知道有什么难求的
动力风暴 2016-09-03
  • 打赏
  • 举报
回复
给定的长方形,有说明长方形的边平行这些条件没有,还是就是你图上的那种情况。 如果什么条件都没有的话,最少有0个重合,最多有8个重合点,是比较难计算的。
caojinrong 2016-09-03
  • 打赏
  • 举报
回复
两个矩形,坐标用X11、X12、Y11、Y12和X21、X22、Y21、Y22表示,且Xi1<Xi2、Yi1<Yi2 当X11〈X21<X12<X22且Y11<Y21<Y12<Y22时两者有交点,交点为(X21,Y12)和(X12,Y21)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧