【XDOJ】C语言结构体综合题带练(2020期末真题)

发布时间:2024年01月13日

【XDOJ】C语言综合题带练(2020期末真题)

最短距离

1

样例1示意图解释:
如图1所示,样例1共有4个结点,编号分别为1、2、3、4,后面括号里给出了结点坐标。下面总共有2个询问:
1 3:从1号结点到3号结点,路径可以选择1?2?3或者1?4?3,距离均为20;
1 4:从1号结点到4号结点,最短路径应为1?4,最短距离为10。

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

int max(int x,int y)
{
	int t;
	t=x>y?x:y;
	return t;
}
int min(int x,int y)
{
	int t;
	t=x<y?x:y;
	return t;
}
double MIN(double x,double y)
{
	double t;
	t=x<y?x:y;
	return t;
}
struct point
{
    int num;
    double x,y;
};
int main()
{
    int n,i,a[10],b[10],count=1,c,d,j;
    scanf("%d",&n);
    struct point per[n];
    double s[10],l=0,x[10]={0},p[10];
    for(i=1;i<=n;i++)
        scanf("%d %lf %lf",&per[i].num,&per[i].x,&per[i].y);
    for(i=1;;i++)
    {
        scanf("%d %d",&a[i],&b[i]);
        if(a[i]==0&&b[i]==0)
            break;
        count++;
    }//记录询问个数 
    for(i=1;i<=n;i++)
    {
    	if(i==n)
    	s[i]=sqrt((per[i].x-per[1].x)*(per[i].x-per[1].x)+(per[i].y-per[1].y)*(per[i].y-per[1].y));
    	if(i<n)
    	s[i]=sqrt((per[i].x-per[i+1].x)*(per[i].x-per[i+1].x)+(per[i].y-per[i+1].y)*(per[i].y-per[i+1].y));
    	l+=s[i];
	}//计算相邻两点的距离 
	for(i=1;i<count;i++)
	{
		c=min(a[i],b[i]);
		d=max(a[i],b[i]);
		for(j=c;j<d;j++)//记录所询问两点间需要经历的点 
		x[i]+=s[j];
		p[i]=MIN(x[i],l-x[i]);//此处数据均为double型,比较两种路径的长度 
		printf("%.2lf\n",p[i]);
	}
}

懒人游戏

1

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

int main()
{
	int n,i,j,MIN,num[100];
	scanf("%d",&n);
	double s[100]={0},d[100],min,x[100],y[100];
	for(i=0;i<n;i++)
	{
		scanf("%d %lf %lf",&num[i],&x[i],&y[i]);
	}
	for(i=0;i<n;i++)
	{
		s[i]=0;//s[i]在每次循环前都要置0 
		for(j=0;j<n;j++)
		{
			d[j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
			s[i]+=d[j];//计算到此同学的距离之和 
		}
	}
	min=s[0];
	for(i=0;i<n;i++)
	{
		if(s[i]<=min)
		{
			min=s[i];
			MIN=i;
		}
	}//找到最短距离并记录位置 
	printf("%d %.2lf",num[MIN],min);
}

快速洗牌

有54张牌,牌面分别为2、3、4、5、6、7、8、9、10、J、Q、K、A、W。其中W有2张,包含两种花色,分别为red和black,其余牌面每种均有4张,包含四种花色,分别为heart、spade、club、diamond。接下来执行洗牌操作,将牌的位置改变为指定位置。例如有5张牌,排列顺序为:heart-3、spade-K、club-10、diamond-A、red-W,给定洗牌操作序列{4,2,5,3,1},即把heart-3放到4号位、spade-K放到2号位、club-10放到5号位、diamond-A放到3号位、red-W放到1号位,于是排序就变成了red-W、spade-K、diamond-A、heart-3、club-10。如果要将上面的洗牌操作执行第2次,则最后的洗牌结果为club-10、spade-K、heart-3、red-W、diamond-A。

#include <stdio.h>

struct draw
{
	char p[54];
	char q[54];
};
int main()
{
	int n,i,j,k,t,m[54];
	scanf("%d",&n);
	struct draw per[n],each[n];
	for(i=0;i<n;i++)
	{
		scanf("%s%s",per[i].p,per[i].q);
	}
	scanf("%d",&k);
	for(i=0;i<n;i++)
	scanf("%d",&m[i]);
	for(i=0;i<k;i++)
	{
		for(j=0;j<n;j++)
		{
			t=m[j]-1;
			each[t]=per[j];
		}
		for(j=0;j<n;j++)
		{
			per[j]=each[j];
		}//此处第一次循环结束后,需要将得到的结果再赋给per 
	}
	for(i=0;i<n;i++)
	{
		printf("%s %s",each[i].p,each[i].q);
		printf("\n");
	}
}
文章来源:https://blog.csdn.net/Chole_Waston/article/details/135481746
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。