K-N皇后问题,回溯法、BFS、DFS,任意数量种类的皇后在棋盘上的摆放方案

两盒软妹~` 提交于 2020-02-15 00:59:12

对最大为MAX*MAX的棋盘,任意数量种的皇后,种类数量以queen记录,每种皇后的同一行,同一列,以及对角线上不能有其他同种类的皇后,一个格子只能放一个皇后棋子,计算最多摆放方案的数量,并记录在ans[][]内,输出方案数量。

判断对角线用

abs(行-行) == abs(列-列)

后续再更新优化,用二进制保存数据判断运算。

#include <iostream>
#include <cmath>
#include <cstring>
#define MAX 13//棋盘最大范围 
#define queen 2//两种棋 

using namespace std;

int N;
int rst = 0;
bool map[MAX][MAX];
int ans[queen][MAX];

void test(){//测试数据
	N = 13;
	for(int i = 0; i < N; ++i){
		for(int j = 0; j < N; ++j){
			map[i][j] = 1;
		}
	} 
}

void inputData(){
	cin >> N;
	for(int i = 0; i < N; ++i){
		for(int j = 0; j < N; ++j){
			cin >> map[i][j];
		}
	}
}

bool check(int row, int column, int chess){
	if(map[row][column] == 1){
		for(int i = 0; i < chess; ++i){
			if(ans[i][row] == column){
				return 0;
			}
		}
		for(int i = 0; i < row; ++i){
			if(ans[chess][i] == column){//判断同列
				return 0;
			}
			if(abs(i - row) == abs(ans[chess][i] - column)){//判断对角线
				return 0;
			}
		}
		return 1;//能放
	}else{
		return 0;//不能放
	}
}

void dfs(int row, int chess){
	if(row == N){
		if(chess == queen-1){
			rst++;
			cout << rst << endl; 
		}else{
			dfs(0, chess + 1);
		}
	}
	for(int column = 0; column < N; ++column){
		if(!check(row, column, chess)){ 
			continue;
		}else{
			ans[chess][row] = column;//记录每种棋在每几行的列数
			dfs(row+1, chess);
		}
	}
}

int main(){
	test();
	dfs(0, 0);//第0种棋的第0行开始 
	cout << rst; 
	return 0;
}

ps:一种棋时,各大小棋盘的解数量

n       solution(n)  
1       1  
2       0  
3       0  
4       2  
5       10  
6       4  
7       40  
8       92  
9       352  
10      724  
11      2680  
12      14200  
13      73712  
14      365596  
15      2279184  
16      14772512  
17      95815104  
18      666090624  
19      4968057848  
20      39029188884  
21      314666222712  
22      2691008701644  
23      24233937684440  
24      227514171973736  
25      2207893435808352  
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!