您的位置:首页 > 其它

乒乓球比赛日程

2017-02-15 11:25 696 查看
如果8皇后问题能理解,这题就是小开撕,http://blog.csdn.net/qq_33193309/article/details/55190608

题目  某学校举行乒乓球比赛,在初赛阶段设置为循环赛,设有n位选手参赛,初赛共进行N-1天,每位选手要与其他每一位选手进行一场比赛,然后按照积分排名选拔进入决赛的选手,根据学校作息时间,要求每位选手每天必须比赛一场,不能轮空。

想想方法有好多。也可以用分治,但是分治之后合并我感觉我有点麻烦,不如直接回溯来的简单

和八皇后不同的是,八皇后记住当前行的列就行,这题需要记住每一行的每一列。没事加一个循环即可。

说下思路:

1.从第一行起,先进行判断(每一行不能重复,列也不能重复...好像数独哦) 找到每一列能放置的对手

2.如果当前行放置的列到达了最大,进行下一行的放置,否则寻找当前行的下一列

3.最后就是输出啦

#include<iostream>
#include<algorithm>
using namespace std;
#define N 8
int a[N+1][N+1];
int pd(int i, int j,int n){//这里面的判断就比八皇后简单好多
for (int k = 0; k < N; k++){
if (a[k][j] == n || a[i][k] == n)
return 0;
}
return 1;
}
void f(int i, int j){
if (i == N || j == N){
for (int k = 0; k < N; k++){
for (int l = 0; l < N; l++)
printf("%d ", a[k][l]);
printf("\n");
}
exit(0);//这里就直接输出一种方法了
}
else{
for (int k = j; k < N; k++){
for (int n = 1; n <= N; n++){//这里就是与八皇后的不同,需要加一个循环对每一个都进行放置
if (pd(i, k,n)){
a[i][k] = n;
if (k == N-1)	//到达最后一列,进行下一行
f(i + 1, 1);
else f(i, k + 1); //否则进行下一列
}
}
}
}
}
int main(){
for (int i = 0; i < N; i++)
a[i][0] = i + 1;//因为初始的每个选手固定。复制一下
f(0, 1);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  回溯