#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>
#define maxn 1281000
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define abs(a) (a>0? a:-(a))
long n,m
void Init(void)
{
long i,j,o=0scanf("%ld%ld",&n,&m)
for(i=1i<=ni++) for(j=1j<=mj++)
{
o++printf("%ld %ld %ld\n",o,i,j)
}
}
int main(void)
{
freopen("dance.in","r",stdin)
freopen("dance.out","w",stdout)
//while(1)
// {
Init()// Begin()//while(1)
//}
return 0
}
for(t=1t<=Tt++){
if((m+y-1)==x) break //m+y-1将女生编号配对到男生编号
m=m+N
n=n+N
while(m>M) m=m-M
while(n>N) n=n-N
}
if(t>T) printf("没有找到配对的\n")
else printf("%d男生找到%d女生,在第%d首曲子\n",x,y,t)
这种查找方法我不赞同,因为舞曲是循环播放的,一轮舞曲结束后还有下一轮,所以应该再添一层循环,或者来一次递归(递归效率太低了)。搭配不能成功就好像追击问题一样,初始时刻两人的状态为A和B,如果在t时刻两人的状态又变成了A和B,若在0~t内没有追上那么就永远也追不上了。同理,对于配对问题,如果轮到第x男生配对第z个女生,到第t次配对又是x~z,如果在1~t次配对过程中没有成功,那么就不能完成配对。比如N = x * M,(N >4,M,x为正整数),如果y != 1那么配对是不能成功的。
个人见解,希望对你有帮助。
其实你这程序我都没那么弄懂你更注重技术上的东西
而我学习c语言更注重算法上的东西
也就是说你想通过简单的运算运用技巧性的东东让电脑帮你计算
而我是通过自己思考的算法让电脑表达出来
其实这两种思路都不矛盾的 各有所长
你这程序 人为设定了m,n 有局限性 也就是说可能不通用
我也试着写了些(如果题意没理解错的话)
其实题2用用题1的程序就行了 你再仔细想想 看看我的问题2
#include<stdio.h>
#include<math.h>
int gac(int m,int n,int y,int t)
{int x,z
if((n*t/m)>0)
{z=(n*t%m+m-n+y)
if(z>m) z=z-m
x=z
}
else x=(n*t-n+y)
return x
}
void main()
{int gac(int m,int n,int y,int t)
int m,n,y,t,a
int x2,y2,t2,a2
printf("问题1\n请输入男女生的人数,以逗号隔开\n")
scanf("%d,%d",&m,&n)
printf("请输入此时跳舞的女生号数\n")
scanf("%d",&y)
printf("请输入此时的曲数\n")
scanf("%d",&t)
a=gac(m,n,y,t)
printf("此时%d号女生的搭档是%d号男生\n",y,a)
printf("问题2\n请输入男主人公及其心仪女生的号数,并以逗号隔开\n")
scanf("%d,%d",&x2,&y2)
t=0
do
{t++
a2=gac(m,n,y2,t)}
while(a2!=x2)
printf("如果%d号男生想要与%d号女生跳舞,需要到第%d首曲子\n",x2,y2,t)
}