自己在书上看到的 一道简单但很有意思的题目
2017-11-22 23:48
399 查看
描述:设有n=2^k个运动员要进行网球循环赛。要设计满足以下要求的比赛日程表:(k<=10)
1.每个选手必须与其他n-1个选手各赛一次;
2.每个选手每天只能参赛一次;
3.循环赛在n-1天内结束。
日程表每一行开头应为选手序号,从小到大依次向下排列,在第i行,第j列处填入第i个选手遇到的选手序号;
输入样例:2
输出样例:1:2
2:1
#include<stdio.h>
#include<math.h>
int used[1024][1024]={0};
int n;
int flag;
int blank();
int canfight(int a,int b,int c);
void search(int x,int y);
void output();
int main()
{
flag=1;
scanf("%d",&n);
search(1,1);
return 0;
}
void search(int x,int y)
{
int i,j;
while(flag==1)
{
if(x==n+1)
{
if(blank()==1)
{
output();
flag=0;
}
}
else if(y==n)
{
search(x+1,1);
}
else
{
for(i=1;i<n+1;i++)
{
if(canfight(x,y,i)==1)
{
used[x][y]=i;
used[i][y]=x;
search(x,y+1);
used[x][y]=0;
used[i][y]=0;
}
}
}
}
}
int canfight(int a,int b,int c)
{
int i;
if(a==c)
{
return 0;
}
if(used[c][b]!=0&&used[c][b]!=a)
{
return 0;
}
for(i=1;i<b;i++)
{
if(used[c][i]==a)
{
return 0;
}
}
return 1;
}
int blank()
{
int i,j;
for(i=1;i<n+1;i++)
{
for(j=1;j<n;j++)
{
if(used[i][j]==0)
{
return 0;
}
}
}
return 1;
}
void output()
{
int i,j;
for(i=1;i<n+1;i++)
{
printf("%d: ",i);
for(j=1;j<n;j++)
{
printf(" %d ",used[i][j]);
}
printf("\n");
}
}
1.每个选手必须与其他n-1个选手各赛一次;
2.每个选手每天只能参赛一次;
3.循环赛在n-1天内结束。
日程表每一行开头应为选手序号,从小到大依次向下排列,在第i行,第j列处填入第i个选手遇到的选手序号;
输入样例:2
输出样例:1:2
2:1
#include<stdio.h>
#include<math.h>
int used[1024][1024]={0};
int n;
int flag;
int blank();
int canfight(int a,int b,int c);
void search(int x,int y);
void output();
int main()
{
flag=1;
scanf("%d",&n);
search(1,1);
return 0;
}
void search(int x,int y)
{
int i,j;
while(flag==1)
{
if(x==n+1)
{
if(blank()==1)
{
output();
flag=0;
}
}
else if(y==n)
{
search(x+1,1);
}
else
{
for(i=1;i<n+1;i++)
{
if(canfight(x,y,i)==1)
{
used[x][y]=i;
used[i][y]=x;
search(x,y+1);
used[x][y]=0;
used[i][y]=0;
}
}
}
}
}
int canfight(int a,int b,int c)
{
int i;
if(a==c)
{
return 0;
}
if(used[c][b]!=0&&used[c][b]!=a)
{
return 0;
}
for(i=1;i<b;i++)
{
if(used[c][i]==a)
{
return 0;
}
}
return 1;
}
int blank()
{
int i,j;
for(i=1;i<n+1;i++)
{
for(j=1;j<n;j++)
{
if(used[i][j]==0)
{
return 0;
}
}
}
return 1;
}
void output()
{
int i,j;
for(i=1;i<n+1;i++)
{
printf("%d: ",i);
for(j=1;j<n;j++)
{
printf(" %d ",used[i][j]);
}
printf("\n");
}
}
相关文章推荐
- 网摘一道百度2014年9月25日面试题(题目是网上看到的,代码是自己写的)
- 看到一道有意思的题目——自增陷阱
- 数学之美——组合小事(今天看到的一个简单的组合学应用,但是觉得挺有意思的)
- 白天看到的一道算法题目,应该是平衡二叉树方面的
- 一道简单而又容易出错的题目
- 一道有意思的javascript题目
- JAVA经典题目,对理解概念很有意思(自己总结)
- 一道简单的题目
- 一道简单而又容易出错的题目
- C++ 一道简单的题目引发的思考
- 一道简单的面试题目:输入1234输出1_2_3_4
- 经常看到有关猫,老鼠,主人的那个题目,这里我想说一下自己的一点想法
- 一道比较有意思的打印题(不需要会很多计算机语言知识,简单的C就行)
- 为完成一道题目 先写了个队列给自己用
- 一道有意思的C++题目
- 华为面试的一道题目 真的是佩服自己好菜,时间到了才做出来
- 一道《有意思的题目》
- Power-of-four-----LeetCode上发现的一道很搞笑并且有意思的简单题!!
- 一道简单而又容易出错的题目
- 一天一道简单题目(1)