N皇后(回溯)

在這裏插入圖片描述
在這裏插入圖片描述
ps:皇后可以攻擊同一行、同一列以及左上角、右上角、左下角、右下角這些角度方向上的任意單位。
時間複雜度:O(n!)
在這裏插入圖片描述

class Solution {
public:
	vector<vector<string>> solveNQueens(int n) {
		vector<vector<string>>res;
		vector<vector<int>>board(n, vector<int>(n, 0));//0表示無皇后,1表示有皇后
		DFS(n, 0, board, res);//一行一行地放皇后
		return res;
	}

	void DFS(int n, int row, vector<vector<int>>&board, vector<vector<string>>&res)
	{
		//0~n-1都填寫完畢
		if (row == n)
		{
			vector<string>track = generate_track(n, board);
			res.push_back(track);
			return;
		}
		for (int col = 0; col < n; col++)
		{
			if (isUsable(board, row, col, n))
			{
				board[row][col] = 1;
				//填寫下一行
				DFS(n, row + 1, board, res);
				board[row][col] = 0;//回溯
			}
		}


	}

	//board[row][col]是否可用
	bool isUsable(vector<vector<int>>&board, int row, int col, int n) {
		//檢查第col列上有無皇后
		for (int i = 0; i <= row - 1; i++)
		{
			if (board[i][col] == 1)return false;
		}
		//檢查左上至右下對角線有無皇后
		for (int i = col - 1; i >= 0; i--)
		{
			if (i + row - col < 0)break;
			if (board[i + row - col][i] == 1)return false;
		}
		//檢查右上至左下對角線有無皇后
		for (int i = col + 1; i < n; i++) {
			if (row + col - i < 0)break;
			if (board[row + col - i][i] == 1)return false;
		}
		return true;
	}


	vector<string> generate_track(int n, vector<vector<int>>&board)
	{
		vector<string>track;
		for (int i = 0; i < n; i++)
		{
			string s = "";
			for (int j = 0; j < n; j++)
			{
				if (board[i][j] == 0)
					s += '.';
				else
					s += 'Q';
			}
			track.push_back(s);
		}
		return track;

	}

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