您的位置:首页 > 其它

suduko及8皇后问题及相关问题的解题思路

2014-02-16 14:26 211 查看
1.经典的N皇后问题

就是个经典的DFS算法

我摆到第一行第一列了哦,然后就开始Deep看下一行,可以放哪,然后递推,直到棋盘的行列到。

void NQueenHelper(vector<vector<string>> & board, vector<vector<string>>& result, int row)
{
int N = board.size();
if (row == N)//reached end scenario
{
string str;
vector<string> final;
for (int i = 0; i<N; i++)
{
for (int j = 0; j<N; j++)
{
str.push_back(board[i][j][0]);
}

final.push_back(str);
str.clear();
}
result.push_back(final);
}

for (int col = 0; col < N; col++)
{
if (isValidMove(board, row, col))
{
board[row][col] = "Q";
NQueenHelper(board, result, row + 1);
board[row][col] = ".";
}
}
}


其中判断suduko的解法中,稍微不同的一点在于

isValidMove
八皇后问题


bool isValidBoard(vector<vector<int>>& board, int col, int row)
{
int size = board.size();
//look at col
for(int i =0; i<col ; i++)
if(board[row][i]) return false;

//look at row
for(int i = 0;i <row; i++ )
if(board[i][col]) return false;

//diag
for(int i= row, j= col; i>=0&&j>=0; i--,j--)
{
if(board[i][j]) return false;
}

for(int i= row, j= col; i>=0&& j<size; i--,j++)
{
if(board[i][j]) return false;
}

return true;

}


而sudoku

判断合法的是

// 检查往某个位置填入一个数之后整个 board 是否有效(只需要考虑当前行、
// 当前列和所属的田字格)
bool isValidBoard(const vector< vector<char> >& board, pair<int, int> pos) {
// 检查当前行是否有效
if (!isValid(board[pos.first])) return false;

// 检查当前列是否有效
vector<char> column(9);
for (int i = 0; i < 9; ++i)
column[i] = board[i][pos.second];
if (!isValid(column)) return false;

// 检查所在的田字格是否有效
int block_row = pos.first / 3;
int block_col = pos.second / 3;
vector<char> block;
for (int i = block_row * 3; i < block_row * 3 + 3; ++i)
for (int j = block_col * 3; j < block_col * 3 + 3; ++j)
block.push_back(board[i][j]);
if (!isValid(block)) return false;

// 如果以上都有效,则返回 true
return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: