7-5 武将单挑

7-5 武将单挑

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

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

输入格式:

第一行为一个整数n(1

测试用例保证合法,且所有整数均可以用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

#include

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

{

scanf("%d",&m);

a[i]=(int *)malloc(sizeof(int)*(m+1));

a[i][0]=m; //每一行首元素存储武将的数目

for(int j=1;j

{

scanf("%d",&a[i][j]);

}

}

int *t; //用于交换行元素的指针

for(int i=0;i

{

for(int k=0;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

{

for(int j=1;j

{

printf("%d ",a[i][j]);

}

printf("%d\n",a[i][a[i][0]]);

}

for(int i=0;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;

}

}

}

🔍 相关推荐