分考场--C语言

题目

n个人参加某项特殊考试。
  为了公平,要求任何两个认识的人不能分在同一个考场。
  求是少需要分几个考场才能满足条件。
输入格式
  第一行,一个整数n(1<n<100),表示参加考试的人数。
  第二行,一个整数m,表示接下来有m行数据
  以下m行每行的格式为:两个整数a,b,用空格分开 (1<=a,b<=n) 表示第a个人与第b个人认识。
输出格式
  一行一个整数,表示最少分几个考场。
样例输入
5
8
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5
样例输出
4
样例输入
5
10
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5
样例输出
5

解题思路

1:用对称矩阵存储考生之间的关系
2:dfs算法(用函数独立模块)
输入:进入考场的人数 x ,这个人还没进时的考场数 kes
运用了递归回溯。

注意点①

if (kes >= min_kes)//防止回溯时的错误
	{
		return;
	}

注意点②

if (x > n)//递归结束的条件
	{
		min_kes = kes;
		return;
	}

源代码

#include<stdio.h>
#include<stdlib.h>

int map[100][100];//考场和座位
int relation[100][100];//考生关系
int min_kes, n;//最小考场数,人数

void DFS(int x, int kes)//待进场人数,考场数
{
	int i;

	if (kes >= min_kes)//防止回溯时的错误
	{
		return;
	}

	if (x > n)//递归结束的条件
	{
		min_kes = kes;
		return;
	}

	for (i = 0; i < kes; i++)//判断与前面进来的是否有关系
	{
		int k=0;

		while (map[i][k] && !relation[x][map[i][k]])
		{
			k++;
		}

		if (!map[i][k])
		{
			map[i][k] = x;
			DFS(x + 1, kes);
		}

	}

	map[kes][0] = x;
	DFS(x + 1, kes + 1);

}


int main()
{
	int t, a, b;//t,关系的次数,a,b,a与b有关系
	scanf_s("%d%d", &n, &t);
	min_kes = n;
	while (t--)//输入关系
	{
		scanf_s("%d%d", &a, &b);
		relation[a][b] = relation[b][a] = 1;
	}

	DFS(1, 0);

	printf("%d", min_kes);

	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45914759/article/details/105495698
今日推荐