| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1646 人关注过本帖
标题:大家来做道题
只看楼主 加入收藏
ninanwine
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2006-5-1
收藏
得分:0 

可以将圆变成4个1/4圆看看有没有什么新发现哈!


用0-1统治世界!
2006-05-02 04:57
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
回复:(ninanwine)可以将圆变成4个1/4圆看看有没有什...
楼上(22楼)朋友:您好。

惺惺惜惺惺!

英雄所见略同。

待会看看谁的代码先出来?

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-02 05:04
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
回复:(–★–)回复:(ninanwine)可以将圆变成4个...
//解题思路可以是这样:

//1 任何圆都可以切成4个1/4的圆。具体说来就是
//设圆心位于(x,y)则它的
//“第1个”1/4圆位于以(x,y)和(x+1,y+1)为顶点的正方形内
//“第2个”1/4圆位于以(x-1,y)和(x,y+1)为顶点的正方形内
//“第3个”1/4圆位于以(x-1,y-1)和(x,y)为顶点的正方形内
//“第4个”1/4圆位于以(x,y-1)和(x+1,y)为顶点的正方形内

//2 相互覆盖的情况有且仅有以下4种:
//⑴未被“他人”遮盖,此时面积=π/4
//⑵被单位间隔的左、右、上、下“邻居”之一覆盖
//⑶被间隔为√2的斜线方向的某个“邻居”所覆盖,此时面积=1
//⑷上述两种情况的叠加,此时面积=1

//3 情况⑵对应的面积=边长为1的等边△+2*圆心角为30°的扇形

//4 ...................................................................................................





落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-02 08:55
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
收藏
得分:0 

看错题目了,我开始没注意到圆心坐标是整数~~~

圆心是整数那这个题的难度就从天上滑到了地上 大家快写吧




叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-05-02 09:04
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
是呀,我晕!

对不礼貌的女生收钱......
2006-05-02 09:18
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

这个程序比较烂,但总算编出来了.
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define PI 3.1415926
typedef struct coordinate
{
int x;
int y;
} coord;
main()
{
int i,j,k,num,maxx,maxy,minx,miny,distant,c1=0,c2=0,c3=0,c4=0;
double area=0;
coord cor[15],checkpoint[225];
printf("Please input the num of the circles:");
scanf("%d",&num);
printf("Now enter the coordinate of the circles:");
for(i=0;i<num;i++)
scanf("%d%d",&cor[i].x,&cor[i].y);

maxx=minx=cor[0].x;
for(i=1;i<num;i++)
{
if(cor[i].x<minx)
minx=cor[i].x;
if(cor[i].x>maxx)
maxx=cor[i].x;
}
maxy=miny=cor[0].y;
for(i=1;i<num;i++)
{
if(cor[i].y<miny)
miny=cor[i].y;
if(cor[i].y>maxy)
maxy=cor[i].y;
}
distant=maxy-miny>maxx-minx?maxy-miny+2:maxx-minx+2;
i=0;
for(k=0;k<distant;k++)
for(j=0;j<distant;j++)
{
checkpoint[i].x=minx-1+j;
checkpoint[i++].y=maxy+1-k;
}
for(k=0;k<distant*distant;k++)
{
for(i=0;i<num;i++)
{
c1+=(checkpoint[k].x==cor[i].x&&checkpoint[k].y==cor[i].y);/*检测点是否在坐标上*/
c2+=(checkpoint[k].x+1==cor[i].x&&checkpoint[k].y==cor[i].y);/*正右边*/
c3+=(checkpoint[k].x+1==cor[i].x&&checkpoint[k].y-1==cor[i].y);/*右下方*/
c4+=(checkpoint[k].x==cor[i].x&&checkpoint[k].y-1==cor[i].y); /*正下方*/
}
if(c1&&c3||c2&c4)
area+=1;
else if(c1&&c2||c3&&c2||c1&&c4||c3&&c4)
area+=sqrt(3.0)/4+PI/6;
else if(c1||c2||c3||c4)
area+=PI/4;
c1=c2=c3=c4=0;
}
printf("The area is %.4lf",area);
getch();
}


对不礼貌的女生收钱......
2006-05-02 12:02
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
N个单位圆(可能部分覆盖)总的占地面积
以下是引用–★–在2006-5-2 8:55:00的发言:
//解题思路可以是这样:

//1 任何圆都可以切成4个1/4的圆。具体说来就是
//设圆心位于(x,y)则它的
//“第1个”1/4圆位于以(x,y)和(x+1,y+1)为顶点的正方形内
//“第2个”1/4圆位于以(x-1,y)和(x,y+1)为顶点的正方形内
//“第3个”1/4圆位于以(x-1,y-1)和(x,y)为顶点的正方形内
//“第4个”1/4圆位于以(x,y-1)和(x+1,y)为顶点的正方形内

//2 相互覆盖的情况有且仅有以下4种:
//⑴未被“他人”遮盖,此时面积=π/4
//⑵被单位间隔的左、右、上、下“邻居”之一覆盖
//⑶被间隔为√2的斜线方向的某个“邻居”所覆盖,此时面积=1
//⑷上述两种情况的叠加,此时面积=1

//3 情况⑵对应的面积=边长为1的等边△+2*圆心角为30°的扇形

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#define Pi 3.1415926535898
double area[]={0,0,0,0,0};

typedef unsigned short ui2;
typedef unsigned long ui4;

typedef struct
{
short x,y;//圆心坐标;
}
Center;

typedef struct
{
ui4 xy; //xy=10000*x+y;
ui2 No; //(1/4)圆的编号
}
Quarter;

double Area(Quarter* p)
{
int ix=0;
switch(p->No)
{
case 15:
case 14:
case 13:
case 11:
case 7: ix++;
case 10:
case 5: ix++;
case 12:
case 9:
case 6:
case 3: ix++;
case 8:
case 4:
case 2:
case 1: ix++;
}
return area[ix];
}

int main(void)
{
Center*pC,*CT;
Quarter*p,*QT,temp;
short NUM;//单位圆的总数
short x,y;//圆心的直角坐标
short x1,x2,y1,y2;//极限值
short i; ui2 j;
double sum=0;//NUM个圆所占总面积

printf("Number of circles = ");
scanf("%d",&NUM);
for(i=1; i<=NUM; i++)
{
printf("circle %d's center(x,y) = ",i);
scanf("%d%*c%d",&x,&y);
if(i==1)
{
pC=CT=(Center*)malloc(NUM*sizeof(Center));
//为节省篇幅,我们假设内存申请是成功的。
x1=x2=x;
y1=y2=y;
}
else
{
if(x<x1)x1=x;//搜索x的极小
if(y<y1)y1=y;//搜索y的极小
if(x>x2)x2=x;//搜索x的极大
if(y>y2)y2=y;//搜索y的极大
}
pC->x=x;pC->y=y;pC++;
}

//下面为1/4圆申请较多的内存,仍默认获得成功:
p=QT=(Quarter*)malloc(4*NUM*sizeof(Quarter));

//下面是把NUM个圆切成4*NUM个Quarter(即1/4圆)
//STEP 1:
//为了让结构体Quarter正常工作,进行坐标平移,
//移动量为:新坐标=旧坐标+(x1+1,y1+1)
//显然这样做不会影响面积计算
for(pC=CT,i=0;i<NUM;i++,pC++)
pC->x+=x1+1,pC->y+=y1+1;
//STEP 2:
//设圆心位于(x,y)则它的
//第1个1/4圆位于以(x,y)和(x+1,y+1)为顶点的正方形内
//第2个1/4圆位于以(x-1,y)和(x,y+1)为顶点的正方形内
//第3个1/4圆位于以(x-1,y-1)和(x,y)为顶点的正方形内
//第4个1/4圆位于以(x,y-1)和(x+1,y)为顶点的正方形内
//下面记录的时候以左下方的顶点坐标为准。
for(pC=CT,i=0; i<NUM; i++,pC++)
{
p->xy=10000L*(pC->x )+(pC->y );p->No=1;p++;
p->xy=10000L*(pC->x-1)+(pC->y );p->No=2;p++;
p->xy=10000L*(pC->x-1)+(pC->y-1);p->No=4;p++;
p->xy=10000L*(pC->x )+(pC->y-1);p->No=8;p++;
}
//STEP 3:
//释放动态数组CT[]使用的内存。
free(CT);
//STEP 4:
//写出4种不同覆盖情况下的面积。
//⑴未被“他人”遮盖,此时面积=π/4
area[1]=Pi/4;
//⑵被单位间隔的左、右、上、下“邻居”之一覆盖
// 面积=边长为1的等边△+2*圆心角为30度的扇形
area[2]=0.5*sin(Pi/3)+2*(Pi/12);
//⑶被间隔为√2的斜线方向的某个“邻居”所覆盖,此时面积=1
//⑷上述两种情况的叠加,此时面积=1
area[3]=area[4]=1;
//STEP 5:
//下面进行最困难的一步——覆盖度统计。
//对数组QT[j]中的xy成员进行排序(冒泡)
for(i=1;i<=4*NUM-1;i++)
for(j=1;j<=4*NUM-i;j++)
if(QT[j-1].xy>QT[j].xy)
{ temp=QT[j-1];
QT[j-1]=QT[j];
QT[j]=temp;
}
//至此有相同参考点(x,y)的
//1/4圆就彼此"挨"得很近了
//下面要统计覆盖度啦:
temp=QT[0];
for(i=j=0;j<4*NUM;j++,i++)
{
while(temp.xy==QT[j].xy)
temp.No|=QT[j++].No;//按位"或"
QT[i]=temp;//i相当于"写指针"
temp=QT[j];
}
//STEP 6:
//计算NUM个圆总的占地面积。
for(j=0;j<=i;j++)
sum+=Area(&QT[j]);
printf("total area = %lf\n",sum);
free(QT);
return 0;
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-02 14:47
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

呵呵,还是楼上的简单,我那个程序有个是我用积分自己动手算的,不像楼上的便利,都用计算机算.


对不礼貌的女生收钱......
2006-05-02 15:01
xiaoyao11
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-4-28
收藏
得分:0 
大家努力工作
2006-05-04 01:58
ninanwine
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2006-5-1
收藏
得分:0 
传说中有一种叫MATLAB的软件专门干这个很牛比,我们学了可惜什么都没听!

用0-1统治世界!
2006-05-04 02:45
快速回复:大家来做道题
数据加载中...
 
   



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

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