0

我做了一个欧拉路径算法,有什么问题?

#include <cstdio>
#include <vector>
#include <iostream>
#include <list>
using namespace std;
int graph[1000][1000];  // 1<n<1000
int n; // 그래프는 n x n 
int i, j, degree[1000] = {},f=1;
list<int> lt1;
void oiler(int u) {
        for(int v=0;v<n;v++){
            while (graph[u][v]>0) {
                graph[u][v]--;
                graph[v][u]--;
                oiler(v);
                }
        }
        lt1.push_back(u);
 }
int main(void) {
    cin >> n;
    for (i = 0; i < n; i++) { 
        for (j = 0; j < n; j++) {
            cin >> graph[i][j];
            sum += graph[i][j]; 
        }
    }
    oiler(0);
    lt1.reverse();
    list<int>::iterator iter = lt1.begin();
    for(iter=lt1.begin(); iter!=lt1.end(); iter++) 
    { 
        printf("%d ", *iter+1);
    } 
}

输入是

6 
0 1 0 1 1 1
1 0 1 1 1 0
0 1 0 1 0 0
1 1 1 0 1 0
1 1 0 1 0 1
1 0 0 0 1 0

输出是

1 2 3 4 1 5 2 4 5 6 1 

它可以工作并产生真正的输出,但没有通过......如果我错过了什么,请告诉我

4

2 回答 2

2

您缺少 的定义sum,这无法编译。你初始化了吗?您是否打算将 1 添加到每个元素:*iter+1

另外,您在倒车清单上浪费时间。你可以使用push_frontfor std::list。在其他情况下,您也可以以相反的顺序进行迭代。在 C++20 及其std::views::

// needs #include <ranges>

for (auto const& item : lt1| std::views::reverse) {
    std::cout << item << " ";
}

在 C++11 中:

for (auto iter = lt1.rbegin(), ei = lt1.rend(); iter != ei; ++iter) {
     std::cout << *iter << " ";
}

对于重复使用,有一些方法可以通过适配器来完成。

于 2021-07-06T06:30:31.730 回答
1

我假设您正在进行在线编码挑战并且一些可见的测试通过了,但是整个测试套件都失败了,对吗?请更新您的问题描述,以明确您的错误是什么。

尽管如此,

for(iter=lt1.begin(); iter!=lt1.end(); iter++) 
{ 
    printf("%d ", *iter+1);
} 

是个坏主意,因为您正试图阅读超出列表末尾的内容。您不会在那里找到有意义的数据,特别是如果列表为空 (n==0)。

尝试

for (auto const& item : lt1)
{
    std::cout << item;
}
于 2021-07-06T05:44:20.060 回答