有一项任务我已经绞尽脑汁三天了。该任务称为计算机类(不要与ICPC的其他任务混淆,有许多类似的任务)。
问题条件:有n*m(分别排列在m行和n张每行)课桌和学生。从1到n*m的每个学生都有一个唯一的(包括n* m)数字。有必要安排学生,使邻居的数目之差超过一个(从上、下、左、右的都是邻居)。
/////////////////////////////////////////////////////////////忘记提到:数限制在1≤n,m≤50的半径范围内。程序工作的时间是半秒(实时的5秒)。/////////////////////////////////////////////////////////////
其结果是:需要编写一个程序(最好是用语言python和C),一种能够接受两个数字(n和m)的算法,以便给出学生排列的任何适当顺序(如果不可能给出这样的安排-1)。
例如:给予: 3,4被接受:
或给予: 1,2被取:-1
我试图解决这个问题:我使用了从n个数字创建所有序列的方法(该方法取自一本书),并使用检查函数来查找所需的序列。当我用一个动态数组做这件事时,我成功了,或者我是这么想的。当需要从15 (3 * 5)或更多的数字中找到答案时,程序也要花很长的时间。
在我得到的建议和很多的思考之后,我打破了头,想出了一个完全解决这个问题的代码。现在该如何解决这个问题?(有代码):
#include <iostream>
using namespace std;
void CClass(int n, int m);
int main(void)
{
while (true) {
cout << "\n Numbers please:\n";
int n, m;
cin >> n;
cin >> m;
cout << endl;
CClass(n, m);
}
}
void CClass(int n, int m) {
int len = n * m;
if (len == 6) {
cout << "1.\t3.\t5.\n4.\t6.\t2.\n";
return ;
}
if (len == 9) {
cout <<"1.\t3.\t5.\n4.\t6.\t2.\n7.\t9.\t11.\n";
return ;
}
if (n < 4) {
if (m < 4) {
cout << "- 1\n";
return ;
}
}
for (int i = 0, j = 2, k = 1; i < len; i++) {
if (len >= j) {
cout << j << ".\t";
j += 2;
}
else {
cout << k << ".\t";
k += 2;
}
if ((i + 1) % n == 0) {
cout << endl;
}
}
}发布于 2021-12-09 14:32:20
我决定先收集屏幕上的所有偶数和奇数作为答案,在这些不起作用的情况下,我只是硬编码(其中只有两个: 3x3;2x3)。您可以看到上面的代码。
https://stackoverflow.com/questions/70258567
复制相似问题