乒乓球比赛日程

来源:互联网 发布:淘宝换货流程 编辑:程序博客网 时间:2024/05/01 20:35

如果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 8int 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;}


0 0