题目:现有n名同学,站成一个圈,他们分别以号码排序,
即从01,02,03到n
第一名同学手中(01)有一个球,他可以将球向左传也可以向右传。
他传出去后,接到球的同学也可以向左或向右传,
一共传m次。
请输出所有可能的传球路线。
n与m由键盘输入,分别满足:
3<=n<=30,1<=m<=30
我自己编了一个程序,但是有错误,谁来帮忙改进一下,顺便说下我那里错了。
我的原程序:
// Head file
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Pre-Declearing
char Out[123];
int counter=0,Now=1;
char Temp[4];
// Main
main()
{
// Declearing Key
int Key(int n,int m);
// Input
int inputn,inputm;
printf("input the number of students (n)\n");
scanf("%d",&inputn);
printf("input the number of times the ball will be passed (m)\n");
scanf("%d",&inputm);
// Pre-setting
Out[1]='0'; Out[2]='1'; Out[0]='*';
Temp[0]='-'; Temp[1]='>';
// Using Key
Key(inputn,inputm);
// Pause screen
system("pause");
}
// Key
int Key(int n,int m)
{int Delete ();
int a,i;
if (counter>m)
puts(Out);
else
{counter=counter+1;
// Passing-right (up)
Now=Now+1;
if(Now==n+1)
Now=1;
if(Now<10)
{Temp[2]='0';
Temp[3]=48+Now;
}
else
{Temp[2]=48+Now/10;
Temp[3]=48+Now-Temp[2]*10;
}
strcat(Out,Temp);
// Passing-left (down)
Now=Now-1;
if(Now==0)
Now=n;
if(Now<10)
{Temp[2]='0';
Temp[3]=48+Now;
}
else
{Temp[2]=48+Now/10;
Temp[3]=48+Now-Temp[2]*10;
}
strcat(Out,Temp);
}
Delete();
}
// Delete
int Delete()
{int i;
for (i=0;i<=122;i++)
if(Out[i]==0)
break;
Out[i-1]=0;
Out[i-2]=0;
Out[i-3]=0;
Out[i-4]=0;
}
我用的是Dev-C++ V.4.9.9.2 (可以读C语言那种)
原程序②段// Key
int Key(int n,int m)
{int Delete ();
int a,i;
if (counter>m)
{puts(Out);
counter=counter-1;
Delete();
}
else
{
// Passing-right (up)
counter=counter+1;
Now=Now+1;
if(Now==n+1)
Now=1;
if(Now<10)
{Temp[2]='0';
Temp[3]=48+Now;
}
else
{Temp[2]=48+Now/10;
Temp[3]=48+Now-Temp[2]*10;
}
strcat(Out,Temp);
Key(n,m);
Now=Now-1;
// Passing-left (down)
counter=counter+1;
Now=Now-1;
if(Now==0)
Now=n;
if(Now==-1)
Now=n-1;
if(Now<10)
{Temp[2]='0';
Temp[3]=48+Now;
}
else
{Temp[2]=48+Now/10;
Temp[3]=48+Now-Temp[2]*10;
}
strcat(Out,Temp);
Key(n,m);
Now=Now+1;
}
}
// Delete
int Delete()
{int i;
for (i=0;i<=122;i++)
if(Out[i]==0)
break;
Out[i-1]=0;
Out[i-2]=0;
Out[i-3]=0;
Out[i-4]=0;
}