3D数组转换成3D std::vector

3

我在代码函数中用3D std::vector替换了一个3D数组,但它进入了一个无限循环。你能给我一点提示吗?我真的需要使用向量而不是数组。谢谢 :)
我的初始代码如下:

//arr is a 3D array of a sudoku table,the 3 rd dimension is for keeping values 0 to 13  
//for a cell, and when I assign values I start from index 1 to 12

bool sol(int arr[12][12][13]) {
int row,col;

if(!find_empty(arr,row,col)) return true;

for(int i=1;i< 12;i++) { //for digits 1 to 12
    if(is_working(arr,row,col,arr[row][col][i]) ) {   //if i can put the value in a cell
        arr[row][col][0] = arr[row][col][i];  //replace the first element for a cell with that value
     //here I want to use vector because I want to use an ac3 algorithm 
     //and remove those values that not satisfy constraints and shrink domain size having less values to verify with backtrack

        if(sol(arr)) return true;

        arr[row][col][0] = 0;
    }
}

return false;//if not backtrack
}

我将用以下内容替换arr:
std::vector<std::vector<std::vector<int> > > vec;
vec.resize(12);
for(int i=0;i<12;i++)
{
vec[i].resize(12);
for(int j=0;j<12;j++)
{
    vec[i][j].resize(13);
    for(int k=0;k<13;k++)
        vec[i][j][k]=table[i][j][k];
   }
} 


bool sol(std::vector<std::vector<std::vector<int> > >& vec) {
int row,col;

if(!find_empty(vec,row,col)) return true;

for(int i=1;i< vec[row][col].size();i++) {//for remainig values in domain
    if(is_working(vec,row,col,vec[row][col][i]) ) {//same as above but having less values to verify for
        vec[row][col][0] = vec[row][col][i];

        if(sol(vec)) return true;

        vec[row][col][0] = 0;
    }
}

return false;
}

现在代码进入了无限循环!初始代码没有错误,只是一个简单的回溯。问题出现在我用vec替换arr后。你能给我一些关于如何用3D向量替换3D arr的建议吗?


2
"编译时出现无限循环" 这是什么意思? - Manu343726
1
你确定要以索引1开始循环吗? - Some programmer dude
vector::resize 通过插入或擦除元素来改变向量的实际内容。 - P0W
你尝试过调试并查看无限循环发生的位置吗? - Kindread
此外,假设您对is_working()或find_empty()的更改没有破坏它,我唯一看到的区别是,最初您将i与for循环中的12进行比较,但现在您将其与向量大小进行比较。这表明向量大小可能不符合您的预期。 - Kindread
显示剩余4条评论
2个回答

1
您的问题不够清晰。如果您能同时发布is_working和find_empty的代码,我们就能看到您如何获取行和列的值。 我本来想把这个作为评论,但由于我是新成员且没有足够的声望,所以我必须将其作为答案发布。一旦您分享is_working()和find_empty()的代码,我会进行编辑。

问题不在代码中,而是在数据结构上。3D向量在修改其元素时出现了问题,导致算法不一致。 - Mougart
可能是代码问题或者向量数值设置的方式有误。但我很高兴你终于让它正常工作了。 - Abhishek

1
我已经解决了这个问题。我使用向量矩阵代替了3D向量,现在它运行得很好:D
也许对于3D,4x4x4更好。
std::vector<std::vector<std::vector<double>>> matrix;

matrix.resize(4, std::vector<std::vector<double>>(4,std::vector<double(4)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接