请谁能解释一下为啥这个排列代码不起作用
Posted
技术标签:
【中文标题】请谁能解释一下为啥这个排列代码不起作用【英文标题】:please can anyone explain me why this permutation code is not working请谁能解释一下为什么这个排列代码不起作用 【发布时间】:2021-05-27 14:00:36 【问题描述】:请任何人指出我做错了什么这是排列代码,它存储了小向量“vec”的所有可能排列,然后显示它
#include<vector>
using namespace std;
vector <vector<int>> ans;
void permut(vector<int> &vec,int index)
if(index==vec.size())
ans.push_back(vec);
return;
for (int i = index ;i<index;i++)
swap(vec[i],vec[i+1]);
permut(vec,index+1);
swap(vec[i],vec[vec.size()]);
int main()
int n; cin>>n;
vector<int> vec(n);
for(int i = 1;i<=n; i ++)
vec[i-1]= i;
permut(vec,0);
for (int j =0 ;j<ans.size();j++)
for(int k = 0 ; k<vec.size();k++)
cout<< vec[j]<<endl;
【问题讨论】:
vec[vec.size()]
将总是是越界访问。您可以访问的最后一个元素是vec.size() - 1
。
或使用vec.back()
。
注意有std::next_permutation
Edit 这个问题包含有关什么不起作用的详细信息。我发现代码存在多个问题,包括您的输出循环。
你可以告诉我这段代码的所有错误 -- 你没有使用std::next_permutation
-- 这算吗?
【参考方案1】:
我们必须从i = start
到i = end
运行for 循环,但您正在从i = index
到i < index
运行它,这意味着您的循环甚至不会运行一次。
#include<bits/stdc++.h>
using namespace std;
vector <vector<int> > ans;
void permut (vector <int> &vec, int start, int end)
// base case
if (start == end)
ans.push_back(vec);
else
for (int i = start; i <= end; i++)
swap(vec[i], vec[start]);
permut(vec, start + 1, end);
swap(vec[i],vec[start]); //backtrack
int main()
int n;
cin >> n;
vector <int> vec(n);
for (int i = 0;i < n; i++)
vec[i]= i + 1;
permut(vec, 0, n - 1);
for (int j = 0; j < ans.size(); j++)
for (int k = 0 ; k < vec.size(); k++)
cout<< ans[j][k];
cout << endl;
【讨论】:
以上是关于请谁能解释一下为啥这个排列代码不起作用的主要内容,如果未能解决你的问题,请参考以下文章
为啥这个 javascript 字符串代码在 Internet Explorer 7 中不起作用?
谁能解释一下为啥这个 android 布局不工作并且在活动启动后立即使活动崩溃
谁能帮我理解为啥在“后缀”起作用时“前缀”不起作用以及如何解决这个问题?