其他分享
首页 > 其他分享> > 7-5 武将单挑

7-5 武将单挑

作者:互联网

你正在玩一款即时策略游戏,游戏中有若干君主(你是其中之一),每个君主手下都有若干武将。每名武将都有一个战力值。君主之间进行战争时有一个很奇怪的武将单挑模式。在该模式下,对战的君主每次各派出一名武将单挑,如果两个武将打平,则双方要再各派一个武将进行单挑,直到分出胜负为止。假设双方在第n次单挑中分出了胜负,则单挑获胜方取得战争胜利。如果一方没有武将可派了(一次战斗出战过的武将不能再次出战),而另一方有,则没有武将方失败。该模式似乎是大家单挑时把战力值大的先派出去即可。然而游戏并没有这么简单,游戏内部的策略是武将单挑时,将武将的战力值模除一个数,然后比较模除后的余数,余数大的会在单挑中获胜。这样各君主很难知道如何派将了。现在假设要模除的数为101,在这种单挑模式下,请你写一段程序来为各个君主排名。

提示:此题内存使用有限制。直接创建二维数组保存数据估计可以过60%的数据

输入格式:

第一行为一个整数n(1<n<5000),代表君主的个数。然后每个君主两行数据,格式为第一行是一个整数m(0<m<1000),代表该君主拥有武将的个数,第二行是m个整数,代表该君主依次派出的武将的战力值。
测试用例保证合法,且所有整数均可以用int类型存储。

输出格式:

共n行,每行为输入中一个君主的武将的战力值(按输入顺序原样输出),在此种单挑模式中最强的君主的数据最先输出,然后是第二强的,以此类推,最后输出是最弱的。

输入样例:

5
10
771 748 210 693 992 297 473 40 891 973
3
103 40 466
6
525 769 183 484 776 307
6
129 47 601 371 775 569
3
197 41 184

输出样例:

197 41 184
771 748 210 693 992 297 473 40 891 973
129 47 601 371 775 569
525 769 183 484 776 307
103 40 466

题意:

题意是各个君主按武将战力值的输入顺序出武将。

思路:

先写一个比较两个君主实力强弱的函数,然后使用排序算法并结合该函数得出输入的君主实力强弱的顺序;注意该题一定要用malloc函数。

代码实现:

#include<stdio.h>
#include<stdlib.h>
int arrcmp(int *a,int *b); //比较任意两个君主实力的函数
int main()
{
	int n;
	scanf("%d",&n);
	int **a;
	a=(int **)malloc(sizeof(int *)*n);
	int m;
	for(int i=0;i<n;i++)
	{
		scanf("%d",&m);
		a[i]=(int *)malloc(sizeof(int)*(m+1));
		a[i][0]=m;    //每一行首元素存储武将的数目
		for(int j=1;j<m+1;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	
	int *t;    //用于交换行元素的指针
	for(int i=0;i<n-1;i++)    //冒泡排序
	{
		for(int k=0;k<n-1-i;k++)
		{
			if(arrcmp(a[k],a[k+1])<0)
			{
				t=a[k];
				a[k]=a[k+1];
				a[k+1]=t;
			}
		}
	}
	
	for(int i=0;i<n;i++)
	{
		for(int j=1;j<a[i][0];j++)
		{
			printf("%d ",a[i][j]);
		}
		printf("%d\n",a[i][a[i][0]]);
	}
	for(int i=0;i<n;i++)
	{
		free(a[i]);
	}
	free(a);
	a=NULL;
	return 0;
}
//君主a的实力强于b,返回1;a弱于b,返回-1;实力相当,返回0
int arrcmp(int *a,int *b)
{
	int min,max;
	if(a[0]>=b[0])    //确定两个君主中武将数目的最小值
	{
		min=b[0];
		max=a[0];
	}
	else
	{
		min=a[0];
		max=b[0];
	}
	
	int flag=0;
	for(int i=1;i<=min;i++)
	{
		if((a[i]%101)>(b[i]%101))
		{
			return 1;
			break;
		}
		else if((a[i]%101)<(b[i]%101))
		{
			return -1;
			break;
		}
		else
		{
			flag++;
		}
	}
	
	if(a[0]==b[0]&&flag==a[0]) //a和b的武将数目相等时
	{
		return 0;
	}
	else     //武将数目不相等时
	{
		if(flag==a[0])
		{
			return -1;
		}
		if(flag==b[0])
		{
			return 1;
		}
	}
}

标签:return,int,单挑,君主,flag,武将
来源: https://blog.csdn.net/m0_49371394/article/details/112853816