输入是大小为n的2D矩阵,它包含从1到N的所有值,即从1到N ^ 2的每个值在矩阵中恰好出现一次。 我正在尝试使用向量中位置n处的向量对来保存输入的索引值(1到n * n)。
#include <iostream>
#include<vector>
using namespace std;
int main() {
int n;
cin>>n;
int a[n][n];
vector<pair<int,int> > v(n*n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
v.insert(v.begin()+a[i][j]-1, make_pair(i+1,j+1));
}
}
for(int i=0;i<n*n;i++)
cout<<v[i].first<<" "<<v[i].second<<endl;
return 0;
}
input: 3
1 7 9
2 4 8
3 6 5
output:1 1
2 1
3 1
0 0
3 3
2 2
3 2
0 0
0 0
expected output:1 1
2 1
3 1
2 2
3 3
3 2
1 2
2 3
1 3
在内部for循环的第一次迭代之后获得意外的输出。
答案 0 :(得分:1)
通过编写vector<pair<int,int> > v(n*n);
,您的向量已经有n * n个条目。当您调用v.insert
时,在指定位置添加另一个并将所有其他向量元素向右移动。现在你的矢量有2 * n * n个条目(你可以尝试打印它们 - 或者只打印它的size()
)。
您应该将此行更改为
v[a[i][j]-1] = make_pair(i+1,j+1);
或者,正如M.M建议的那样,你可以使用
v.at(a[i][j]-1) = make_pair(i+1,j+1);
当参数超出范围时抛出out_of_range异常。这当然是更安全的解决方案。