乒乓球比赛日程
2017-02-15 11:25
696 查看
如果8皇后问题能理解,这题就是小开撕,http://blog.csdn.net/qq_33193309/article/details/55190608
题目 某学校举行乒乓球比赛,在初赛阶段设置为循环赛,设有n位选手参赛,初赛共进行N-1天,每位选手要与其他每一位选手进行一场比赛,然后按照积分排名选拔进入决赛的选手,根据学校作息时间,要求每位选手每天必须比赛一场,不能轮空。
想想方法有好多。也可以用分治,但是分治之后合并我感觉我有点麻烦,不如直接回溯来的简单
和八皇后不同的是,八皇后记住当前行的列就行,这题需要记住每一行的每一列。没事加一个循环即可。
说下思路:
1.从第一行起,先进行判断(每一行不能重复,列也不能重复...好像数独哦) 找到每一列能放置的对手
2.如果当前行放置的列到达了最大,进行下一行的放置,否则寻找当前行的下一列
3.最后就是输出啦
题目 某学校举行乒乓球比赛,在初赛阶段设置为循环赛,设有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; }
相关文章推荐
- 第一届“小李木耳杯”乒乓球比赛落幕 2011年2月27
- 近期比赛日程
- 猴子吃桃&乒乓球比赛
- 拿下园区乒乓球比赛团体冠军
- 乒乓球比赛 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比 请编程序找出三队赛手的名单。
- 乒乓球比赛
- 6.15两个乒乓球对进行比赛,各出三人。
- 循环比赛日程(递归解法)
- c编程:乒乓球比赛,找出谁和谁对打
- 乒乓球比赛赛程安排
- 球员比赛属性说明与日程简介
- 关于乒乓球比赛的一个java程序题
- 乒乓球比赛
- C语言经典算法100例-022-乒乓球比赛名单问题
- OpenMPI学习笔记(五)之乒乓球比赛模拟(一)
- 分治算法:乒乓球比赛的日程安排
- 用程序解决一个实际问题---n支球队进行单循环比赛,每天一场,给出一个比赛日程,使每支球队在两场比赛之间至少间隔一天
- 乒乓球比赛
- 冠军奖30万!刘强东搞了个“猪脸识别”比赛,中美两地同时启动(附比赛详细日程及赛题说明)
- 分治法解乒乓球比赛日程安排问题