确定数独板是否有效

问题描述 投票:0回答:1

我遵循了Adnan Aziz等人的《编程面试C ++的元素》中的解决方案。他们拥有确定数独板是否有效的解决方案。

#include <iostream>
#include <vector>
#include <utility>
#include <cmath>
#include <deque>

using namespace std;

bool HasDuplicate(vector<vector<char>>& partial_assignment, int start_row, int end_row, int start_col, int end_col);

bool sudokuSolve(vector<vector<char>>& Board)
{
    // your code goes here
    // Check the row constraint

    // Check row constraint
    for (int i = 0; i < Board.size(); ++i)
    {
        if (HasDuplicate(Board, i, i + 1, 0, Board.size()))
            return false;
    }

    // Check column constraint
    for (int j = 0; j < Board.size(); ++j)
    {
        if (HasDuplicate(Board, 0, Board.size(), j, j + 1))
            return false;
    }

    // Check regional constraints
    int region_size = (int)sqrt(Board.size());
    for (int i = 0; i < region_size; ++i)
    {
        for (int j = 0; j < region_size; ++j)
        {
            if (HasDuplicate(Board, region_size * i, region_size * (i + 1), region_size * j, region_size * (j + 1)))
                return false;
        }
    }
    return true;
}

bool HasDuplicate(const vector<vector<int>>& partial_assignment, int start_row,
    int end_row, int start_col, int end_col)
{
    // this creates a container for bookkeeping of used numbers
    // size+1 because the number 1-x are used.
    deque<bool> is_present(size(partial_assignment) + 1, false);

    // The variables i and j are used to go through every coordinate on the
    // sudoku game board.
    for (int i = start_row; i < end_row; ++i)
    {
        for (int j = start_col; j < end_col; ++j)
        {
            // here it checks if the current number is already marked as used in "is_present"
            // if it is, then it's a duplicate and the function returns true.

            // The value 0 is used at coordinates where no number has been
            // selected.
            if (partial_assignment[i][j] != 0 && is_present[partial_assignment[i][j]])
                return true;

            // otherwise, mark the number as used
            is_present[partial_assignment[i][j]] = true;
        }

    }
    return false;
}

int main() {

    std::vector<std::vector<char>> board = {
    {'5','3','.','.','7','.','.','.','.'},
    {'6','.','.','1','9','5','.','.','.'},
    {'.','9','8','.','.','.','.','6','.'},
    {'8','.','.','.','6','.','.','.','3'},
    {'4','.','.','8','.','3','.','.','1'},
    {'7','.','.','.','2','.','.','.','6'},
    {'.','6','.','.','.','.','2','8','.'},
    {'.','.','.','4','1','9','.','.','5'},
    {'.','.','.','.','8','.','.','7','9'}
    };

    std::cout << sudokuSolve(board) << "\n";
    return 0;
}

不幸的是,作者提供的代码似乎有一些错误。当我收到这些无法修复的错误时:

1>------ Build started: Project: Test, Configuration: Debug Win32 ------
1>Source.obj : error LNK2019: unresolved external symbol "bool __cdecl HasDuplicate(class std::vector<class std::vector<char,class std::allocator<char> >,class std::allocator<class std::vector<char,class std::allocator<char> > > > &,int,int,int,int)" (?HasDuplicate@@YA_NAAV?$vector@V?$vector@DV?$allocator@D@std@@@std@@V?$allocator@V?$vector@DV?$allocator@D@std@@@std@@@2@@std@@HHHH@Z) referenced in function "bool __cdecl sudokuSolve(class std::vector<class std::vector<char,class std::allocator<char> >,class std::allocator<class std::vector<char,class std::allocator<char> > > > &)" (?sudokuSolve@@YA_NAAV?$vector@V?$vector@DV?$allocator@D@std@@@std@@V?$allocator@V?$vector@DV?$allocator@D@std@@@std@@@2@@std@@@Z)
1>  Hint on symbols that are defined and could potentially match:
1>    "bool __cdecl HasDuplicate(class std::vector<class std::vector<int,class std::allocator<int> >,class std::allocator<class std::vector<int,class std::allocator<int> > > > const &,int,int,int,int)" (?HasDuplicate@@YA_NABV?$vector@V?$vector@HV?$allocator@H@std@@@std@@V?$allocator@V?$vector@HV?$allocator@H@std@@@std@@@2@@std@@HHHH@Z)
1>C:\Dev\Test\Debug\Test.exe : fatal error LNK1120: 1 unresolved externals
1>Done building project "Test.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

任何人都可以发现错误吗?

c++ algorithm sudoku
1个回答
0
投票

正确的代码是。#包括#包括#包括#包括#include

using namespace std;

bool HasDuplicate(vector<vector<char>>& partial_assignment, int start_row,
    int end_row, int start_col, int end_col)
{
    // this creates a container for bookkeeping of used numbers
    // size+1 because the number 1-x are used.
    deque<bool> is_present(partial_assignment.size() + 1, false);

    // The variables i and j are used to go through every coordinate on the
    // sudoku game board.
    for (int i = start_row; i < end_row; ++i)
    {
        for (int j = start_col; j < end_col; ++j)
        {
            // here it checks if the current number is already marked as used in "is_present"
            // if it is, then it's a duplicate and the function returns true.

            // The value 0 is used at coordinates where no number has been
            // selected.
            if (partial_assignment[i][j] != 0 && is_present[partial_assignment[i][j]])
                return true;

            // otherwise, mark the number as used
            is_present[partial_assignment[i][j]] = true;
        }

    }
    return false;
}

bool sudokuSolve(vector<vector<char>>& Board)
{
    // your code goes here
    // Check the row constraint

    // Check row constraint
    for (int i = 0; i < Board.size(); ++i)
    {
        if (HasDuplicate(Board, i, i + 1, 0, Board.size()))
            return false;
    }

    // Check column constraint
    for (int j = 0; j < Board.size(); ++j)
    {
        if (HasDuplicate(Board, 0, Board.size(), j, j + 1))
            return false;
    }

    // Check regional constraints
    int region_size = (int)sqrt(Board.size());
    for (int i = 0; i < region_size; ++i)
    {
        for (int j = 0; j < region_size; ++j)
        {
            if (HasDuplicate(Board, region_size * i, region_size * (i + 1), region_size * j, region_size * (j + 1)))
                return false;
        }
    }
    return true;
}



int main() {

    std::vector<std::vector<char>> board = {
    {'5','3','.','.','7','.','.','.','.'},
    {'6','.','.','1','9','5','.','.','.'},
    {'.','9','8','.','.','.','.','6','.'},
    {'8','.','.','.','6','.','.','.','3'},
    {'4','.','.','8','.','3','.','.','1'},
    {'7','.','.','.','2','.','.','.','6'},
    {'.','6','.','.','.','.','2','8','.'},
    {'.','.','.','4','1','9','.','.','5'},
    {'.','.','.','.','8','.','.','7','9'}
    };

    std::cout << sudokuSolve(board) << "\n";
    return 0;
}

更正:1.更改了HasDuplicate签名,如果要在一个文件中写入文件,则无需提前声明它。

© www.soinside.com 2019 - 2024. All rights reserved.