簡體   English   中英

代碼在它實際應該結束之前結束,我正在使用 std::time()

[英]Code ends before it actually should, I'm using std::time()

我正在編寫一個代碼,試圖通過隨機給出 colors (根據一些簡單的算法)來正確繪制圖形中的所有點,而我還有時間。 正確意味着沒有兩個相同顏色的點是相鄰的。 此外,每個點的顏色都必須與初始點不同。

我注意到在一個簡單的測試中,當我設置時間限制 <=3 秒時它給出了錯誤的答案,但它在 3 秒內不起作用,它幾乎立即拋出“不可能”,這是代碼的一部分( startendtl是全球性的):

    std::string new_paint;
    bool success = false;
    while (!success && end - start < tl) {
        std::time(&end);
        new_paint = TryPaint(edges, paint, success, v);
    }
    if (success) {
        for (int i = 1; i < new_paint.size(); ++i) {
            std::cout << new_paint[i];
        }
    } else {
        std::cout << "Impossible";
    }

測試是:

3 3
RGB
1 2
2 3
1 3

它的意思是“3 個點,3 個邊緣,初始顏色 RGB,邊緣在 1 2、1 3 和 2 3 之間”

我還注意到,當我嘗試 cout end - start它在這個測試中給出6 我不明白出了什么問題 smn 可以幫忙嗎?

我使用 CLion,Cmake 看起來像這樣:

cmake_minimum_required(VERSION 3.21)
project(untitled1)

set(CMAKE_CXX_STANDARD 14)

add_executable(untitled1 main.cpp)

以下是完整版代碼:

#include <chrono>
#include <iostream>
#include <vector>
#include <set>
#include <random>
#include <algorithm>

time_t start, end;
const int tl = 20;

void check(std::vector<bool>& color, const std::string& paint, int n) {
    if (paint[n] == 'R') {
        color[0] = false;
    } else if (paint[n] == 'G') {
        color[1] = false;
    } else {
        color[2] = false;
    }
}

std::string available_color(std::vector<bool>& color) {
    std::string s;
    if (color[0]) {
        s += 'R';
    }
    if (color[1]) {
        s += 'G';
    }
    if (color[2]) {
        s += 'B';
    }
    return s;
}

std::string TryPaint(std::vector<std::set<int>>& edges, std::string paint, bool& success, int v) {
    std::vector<bool> was(v + 1);
    int count = 0;
    std::vector<int> deck;
    for (int i = 0; i < v; ++i) {
        deck.push_back(i + 1);
    }
    std::random_shuffle(deck.begin(), deck.end());

    while (count != v) {
        auto now = deck[count];
        std::vector<bool> color = {true, true, true};
        check(color, paint, now);
//        std::cout << now << '\n';

        for (const auto& i : edges[now]) {
            std::time(&end);
            if (end - start >= tl) {
                success = false;
                return "";
            }
            if (was[i]) {
                check(color, paint, i);
            }
        }

        std::string choice = available_color(color);
//        std::cout << choice << '\n';

        if (choice.empty()) {
            success = false;
            return "";
        } else {
            ++count;
            was[now] = true;
            char new_color = choice[0];
            paint[now] = new_color;
        }
    }
    success = true;
    return paint;
}

int main(){
    std::time(&start);
    std::time(&end);
    int v, e;
    std::cin >> v >> e;
    std::string paint;
    std::cin >> paint;
    paint = '#' + paint;
    std::vector<std::set<int>> edges(v + 1);
    for (int i = 0; i < e; ++i) {
        int a, b;
        std::cin >> a >> b;
        edges[a].insert(b);
        edges[b].insert(a);
    }
    std::string new_paint;
    bool success = false;
    while (!success && end - start < tl) {
        std::time(&end);
        new_paint = TryPaint(edges, paint, success, v);
//        std::cout << "-------------------------------------------------\n";
    }
    if (success) {
        for (int i = 1; i < new_paint.size(); ++i) {
            std::cout << new_paint[i];
        }
    } else {
        std::cout << "Impossible";
    }
    std::cout << '\n';
    return 0;
}

使用 difftime() 計算兩個 time_t 變量之間的秒數。 time_t 是不透明的,可以根據文檔在不同系統上包含不同的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM