首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >本地ICPC“计算机类”的旧任务

本地ICPC“计算机类”的旧任务
EN

Stack Overflow用户
提问于 2021-12-07 10:32:31
回答 1查看 65关注 0票数 -1

有一项任务我已经绞尽脑汁三天了。该任务称为计算机类(不要与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)或更多的数字中找到答案时,程序也要花很长的时间。

在我得到的建议和很多的思考之后,我打破了头,想出了一个完全解决这个问题的代码。现在该如何解决这个问题?(有代码):

代码语言:javascript
复制
#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;
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-09 14:32:20

我决定先收集屏幕上的所有偶数和奇数作为答案,在这些不起作用的情况下,我只是硬编码(其中只有两个: 3x3;2x3)。您可以看到上面的代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70258567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档