解题思路:
注意事项:
参考代码:
static int n,min=100;
static int arr[][];//用一个二维数组来表达考生人数;
static int examRoom[][];//一个二维数组来表示考场数量
static int examStuNum[];//一个一位来表示每一个考场的人数
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();//来表示考试参加的人数
int m=sc.nextInt();//来表示m行数据
arr=new int[n+1][n+1];//录入考生人数
examRoom=new int[n+1][n+1];//录入考场数量
examStuNum=new int[n+1];//定义每一个考场的数量
int a,b;
for (int i=1;i<=m;i++){
//定义一个for来遍历我们每一个考场的人;
a=sc.nextInt();
b=sc.nextInt();
arr[a][b]=1;
arr[b][a]=1;
}
dfs(1,0);
System.out.println(min);
}
static void dfs(int stunum,int examnum){
if(examnum>=min)return;//如果考场数大于最小数就返回
if(stunum>n){
//如果所有的学生安排完了,得出最小考场数
min=examnum<min?examnum:min;
return;
}
//都不满足以上要求的话,就开始遍历考场
for(int i=1;i<=examnum;i++){
int j;
for ( j=1;j<=examStuNum[i];j++){
//如果考场上有人认识的话,就打破循环
if(arr[stunum][examRoom[i][j]]==1){
break;
}
}
//如果考场上的人都不认识的话我们就继续搜索
if(j==examStuNum[i]+1){
//将此考生加入考场
examRoom[i][++examStuNum[i]]=stunum;
//dfs继续搜索下一轮
dfs(stunum+1,examnum);
--examStuNum[i];
}
}
//如果考场上的人都认识的话,就开辟一个新的考场
//将考生放入新的考场作中
examRoom[examnum+1][++examStuNum[examnum+1]]=stunum;
//dfs继续搜索下一个
dfs(stunum+1, examnum+1);
//回溯
--examStuNum[examnum+1];
}
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复