3

コード関数で 3D 配列を 3D std::vector に置き換えましたが、無限ループに入りました

//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;
}

そして今、無限ループに入っています!最初のコードにはエラーがなく、単純なバックトラッキングです.arrをvecに置き換えた後に問題が発生します.3D arrを 3D ベクトルに置き換える方法についてアドバイスをいただけますか?

4

2 に答える 2

1

あなたの質問は十分に明確ではありません。is_working と find_empty のコードも投稿できれば、行と列の値を取得する方法を確認できます。私はこれをコメントとして入れたでしょうが、新しいメンバーであり、十分な評判がないので、これを答えとして入れなければなりません. is_working() と find_empty() のコードを共有したら編集します

于 2013-08-22T02:06:29.280 に答える
1

私は問題を解決しました.3Dベクトルの代わりにベクトルのマトリックスを使用しました.それはうまく機能します:D

于 2013-08-22T09:47:25.263 に答える