leetcode上面難度hard題

  1. N-Queens N皇后問題,輸出全部解
  • 判斷函數
bool isvalid(int row,int col,int N,vector<int> &record)//判斷是否能夠放置
{
    for(int i=0;i<N;i++)
    {
        if(record[i] == col || abs(i-row) == abs(record[i]-col))
            return false;
    }
    return true;
}
  • 輸出函數
void print(vector<vector<string>> &result,vector<int> &record,int N)//輸出
{
    ostringstream re;
    vector<string> temp;
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N;j++)
        {
            if(record[i] == j)
                re<<'Q';
            else
                re<<'.';
        }
        temp.push_back(re.str());
        re.str("");
    }
    result.push_back(temp);
}
  • 非遞歸的主體函數實現
    vector<vector<string>> solveNQueens(int n) {
        vector<vector<string>> result;
        int row=0,col=0;
        vector<int> record(n,-10000);
        while(row<n)
        {
            while(col<n)
            {
                if(isvalid(row,col,n,record))
                {
                    record[row] = col;
                    col = 0;
                    break;
                }
                else
                {
                    col++;
                }
            }
            if(record[row] == -10000)//若這一行沒有放置
            {
                if(row==0)//退到第一行,程序結束
                    break;
                else
                {
                    --row;   //回退到上一行
                    col=record[row] +1;//上一行往右移一列
                    record[row] = -10000;//清除上一行的皇后
                    continue;
                }
            }
            if(row == n-1)
            {
                print(result,record,n);
                col = record[row]+1;//往右移一列
                record[row] = -10000;//清除本行的皇后
                continue;
            }
            ++row;
        }
        return result;
    }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章