八皇后_回溯法

解題思路

深搜、標記以及回溯

算法詳情

介紹順序:標記->深搜->回溯

1.標記
使用數組記錄無法下棋的部分:

bool flag[4][100];

當置爲1時,即爲無法再放置的標記,具體標記內容:

flag[1][j]=1 //標記j列不能再放置
flag[2][i+j]=1 //標記對角線 
flag[3][i-j+n]=1 //標記對角線

舉個例子,當棋盤爲4*4時:

flag[2][i+j]=1// i=2,j=3;顯見在紅線處都應該設爲1

在這裏插入圖片描述

flag[3][i-j+n]=1 // i=2,j=3;顯見在紅線處應都無法放置

在這裏插入圖片描述
2.代碼

#include<iostream>
using namespace std;
int res; bool flag[4][100]; int n;

void dfs(int i) {
	int j;
	if (i > n) {
		res++;
		return;
	}
	for (j = 1; j <= n; j++) {
		if ((flag[1][j] == 0) && (flag[2][i + j] == 0) && (flag[3][i - j + n] == 0)) {
			flag[1][j] = 1;//標記
			flag[2][i + j] = 1;//標記
			flag[3][i - j + n] = 1;//標記
			dfs(i + 1);
			flag[1][j] = 0;//回溯
			flag[2][i + j] = 0;//回溯
			flag[3][i - j + n] = 0;//回溯
		}
	}
}

int main() {
	cin >> n;
	dfs(1);
	cout << res;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章