用c++帮助老师排座位
2024-10-19 14:36:48
发布于:北京
最近有一件事使我的班主任十分苦恼,许多同学总会在课上交头接耳,为了避免这种情况,我们敬爱的班主任在每周排座位时就会将交头接耳的同学分开。
可是交头接耳的同学人数众多,为了将他们全部分开,班主任每周都要花大量时间排座位。
为了帮助我们可怜的班主任,我决定完成一个程序,帮助班主任排座位
很快我就完成了
(我们班一共31人,学号为1-32,没有19号,座位5x6,座位从左往右第二列有7个人)
#include <bits/stdc++.h>
using namespace std;
int seats[10][10] ;
int main() {
cout << "一共有多少组交头接耳的学生:" ;
int T;
cin >> T;
// 存储交头接耳的学生对
vector<pair<int, int> > s(T);
for (int i = 0; i < T; i++) {
cout << "第" << i + 1 << "组交头接耳的学生:" ;
cin >> s[i].first >> s[i].second;
}
// 存储每个学生的座位位置
map<int, pair<int, int> > studentSeats;
// 尝试将学生分配到座位上
for(int i = 1 ; i <= 32 ; i++) { //遍历所有学号
if(i == 19){continue;}//我们班没有19号
bool placed = false;
for (int row = 0; row < 7; ++row) {
for (int col = 0; col < 5; ++col) {//遍历所有座位
if(row == 6 && col != 1){continue;}//座位从左往右第二列有7个人
if (seats[row][col] == 0) {
bool canPlace = true;
for (int j = 0; j < T; ++j) {//遍历所有交头接耳的学生对
pair<int, int> pair = s[j];
if (pair.first == i || pair.second == i) {
// 在 C++98 中使用 map 的查找方法
if (studentSeats.find(pair.first) != studentSeats.end()) {
if (row == studentSeats[pair.first].first || col == studentSeats[pair.first].second) {
canPlace = false;
break;
}
}
}
}
if (canPlace) {
seats[row][col] = i;
studentSeats[i] = make_pair(row, col); // 使用 make_pair
placed = true;
break;
}
}
}
if (placed) break;
}
}
cout << "排好的座位:" << endl ;
// 输出座位安排
for (int row = 0; row < 7; ++row) {
for (int col = 0; col < 5; ++col) {
if(row == 6 && col == 0){cout << " ";}
if(row == 6 && col != 1){continue;}
cout << seats[row][col] << " ";
if(seats[row][col] < 10){cout << " ";}
}
cout << endl;
}
return 0;
}
虽然排好的座位确实分开了交头接耳的学生,但是我写完代码运行的时候又发现一个很严重的问题,太有序了!
你运行一些代码就知道我在说什么了
由于是1-32顺序遍历学号并尝试填充,所以只要当前遍历到的学生不是交头接耳的学生,那么座位就是有序的!
于是我打乱了遍历学号的顺序,代码成了这样
#include <bits/stdc++.h>
using namespace std;
int seats[10][10] ;
int sid[40] ;//存储学号的遍历顺序
int main() {
cout << "一共有多少组交头接耳的学生:" ;
int T;
cin >> T;
// 存储交头接耳的学生对
vector<pair<int, int> > s(T);
for (int i = 0; i < T; ++i) {
cout << "第" << i + 1 << "组交头接耳的学生:" ;
cin >> s[i].first >> s[i].second;
}
// 存储每个学生的座位位置
map<int, pair<int, int> > studentSeats;
for(int i = 1 ; i <= 32 ; i++){
sid[i] = i ;
}
srand(time(0)) ;
for(int i = 1 ; i <= 32 ; i++){
swap(sid[rand()%32+1],sid[rand()%32+1]) ;//打乱学号遍历顺序
}
// 尝试将学生分配到座位上
for(int j = 1 ; j <= 32 ; j++) {//遍历所有学号
int i = sid[j] ;//用打乱的顺序遍历学号
if(i == 19){continue;}//我们班没有19号
bool placed = false;
for (int row = 0; row < 7; ++row) {
for (int col = 0; col < 5; ++col) {//遍历所有座位
if(row == 6 && col != 1){continue;}//座位从左往右第二列有7个人
if (seats[row][col] == 0) {
bool canPlace = true;
for (int j = 0; j < T; ++j) {
pair<int, int> pair = s[j];
if (pair.first == i || pair.second == i) {
// 在 C++98 中使用 map 的查找方法
if (studentSeats.find(pair.first) != studentSeats.end()) {
if (row == studentSeats[pair.first].first || col == studentSeats[pair.first].second) {
canPlace = false;
break;
}
}
}
}
if (canPlace) {
seats[row][col] = i;
studentSeats[i] = make_pair(row, col); // 使用 make_pair
placed = true;
break;
}
}
}
if (placed) break;
}
}
cout << "排好的座位:" << endl ;
// 输出座位安排
for (int row = 0; row < 7; ++row) {
for (int col = 0; col < 5; ++col) {
if(row == 6 && col == 0){cout << " ";}
if(row == 6 && col != 1){continue;}
cout << seats[row][col] << " ";
if(seats[row][col] < 10){cout << " ";}
}
cout << endl;
}
return 0;
}
我终于完成了排座位的程序
这里空空如也
有帮助,赞一个