c语言解决田忌赛马问题。我的代码总过不了,求debug。。

赢一局得两百,输一局失两百,求最大收益。共有多组数据,以0为输入结束。其中,每组数据第一行为本次参加赛马的对数
Sample Input
3
92 83 71
95 87 74
2
20 20
20 20
2
20 19
22 18
0
Sample Output
200
0
0

#include<stdio.h>
#define N 50
#define M 1000
void rank(int s[N],int n);
int main()
{
int n[M],m,w=0,tian[M][N],king[M][N],i,j,k,d;
scanf("%d",&n[1]);
for(m=1;n[m]!=0;m++)
{
for(i=0;i<n[m];i++)
scanf("%d",&tian[m][i]);
for(i=0;i<n[m];i++)
scanf("%d",&king[m][i]);
rank(tian[m],n[m]);
rank(king[m],n[m]);
scanf("%d",&n[m+1]);
} //以上完成了输入和降序排序
for(k=1;k<m;k++)
{
for(i=0;i<n[k];i++)//从最强的开始比
{
if(tian[k][i]>king[k][i])//如果能赢,则赢,w表示赢的总数
w++;
else if(tian[k][i]<king[k][i])//如果当前的输了,则让最弱的当炮灰,并把当前数组全部后移一位
{
w--;
for(j=n[k]-1;j>i;j--)
tian[k][j]=tian[k][j-1];
}
else if(tian[k][i]==king[k][i])//如果当前平局
{
if(tian[k][n[k]-1]<king[k][n[k]-1])//如果田忌最弱的一匹输给国王最弱的,则让最弱的当炮灰
{
for(j=n[k]-1;j>i;j--)
tian[k][j]=tian[k][j-1];
w--;
}
else if(tian[k][n[k]-1]==king[k][n[k]-1])//如果最弱的和国王最弱的平局
{
if(tian[k][n[k]-1]<tian[k][i])//如果最弱的比当前马弱,则让他炮灰,这样写是为了避免所有马能力一样的情况
{
w--;
for(j=n[k]-1;j>i;j--)
tian[k][j]=tian[k][j-1];
}
}
else
{
for(d=n[k]-2;d>i;d--)//如果最弱的赢了国王最弱的,则继续从最弱的那个往前比
if(tian[k][d]<=king[k][d])
break;
if(d>i)//如果倒着比的过程中一旦出现比国王对应的马弱或者相等,则让最弱的炮灰
{
w--;
for(j=n[k]-1;j>i;j--)
tian[k][j]=tian[k][j-1];
}
}
}
}
printf("%d\n",w*200);
w=0;
}
}
void rank(int s[N],int n)
{
int i,j,t;
for(i=0;i<n;i++)
for(j=0;j<n-i-1;j++)
if(s[j]<s[j+1])
{
t=s[j];
s[j]=s[j+1];
s[j+1]=t;
}
}

第1个回答  2012-04-09
我的代码;
#include<stdio.h>
int main()
{
int n,s,i,j,sub=0,sum=0;
int tfast,tslow,wfast,wslow; //分别代表田的最快马,最慢马,王的最快马,最慢马
int t[1000],w[1000];
while(scanf("%d",&n)&&(n!=0))
{
for(i=0;i<n;i++)
scanf("%d",&t[i]);
for(i=0;i<n;i++)
scanf("%d",&w[i]);
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
if(t[j]<t[j+1])
{s=t[j];t[j]=t[j+1];t[j+1]=s;}
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
if(w[j]<w[j+1])
{s=w[j];w[j]=w[j+1];w[j+1]=s;} //由大到小排序

tfast=0;tslow=n-1;
wfast=0;wslow=n-1; //最快最慢马的初始化

for(i=0;i<n;i++) //分三种情况
{
if(t[tfast]==w[wfast]) //情况1
{
if(t[tslow]>w[wslow]){sub++;tslow--;wslow--;}
else if(t[tslow]<w[wslow]){sub--;tslow--;wfast++;}
else if(t[tslow]==w[wslow])
{
if(t[tslow]<w[wfast]){sub--;tslow--;wfast++;}
else if(t[tslow]==w[wfast]){break;}
}
}
else if(t[tfast]>w[wfast]) //情况2
{sub++;tfast++;wfast++;}
else {sub--;tslow--;wfast++;} //情况3
}
sum=sub*200;
printf("%d\n",sum);
sub=0;sum=0;
}
}
相似回答