入门经典-7.4回溯法-1八皇后

一般n皇后代码如下
输入n 输出方案个数

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=30;
int n,tot;//tot初始化 
int vis[maxn][3];
int C[maxn];
void search(int cur){
	if(cur==n) tot++;//不是n-1 
	else {
		for(int i=0;i<n;i++)if(!vis[i][0]&&!vis[cur-i+n][1]&&!vis[cur+i][2]){
			C[cur]=i;
			vis[i][0]=vis[cur-i+n][1]=vis[cur+i][2]=1;
			search(cur+1);
			vis[i][0]=vis[cur-i+n][1]=vis[cur+i][2]=0;
		}
		
	}

}
int main(){
	memset(vis,0,sizeof(vis));
	memset(C,0,sizeof(C));
	cin>>n;
	tot=0;
	search(0);
	cout<<tot;
	system("pause");
	return 0;
} 

题目描述:

国际象棋的棋盘可以看做是一个 8 × 8 的矩阵,上面每一个格子仅能放一枚棋子,现在给出一个 8 × 8 的由 0 和 1 组成的矩阵,代表象棋棋盘,1 代表当前位置放置了一个皇后,0 则代表什么都没有放,上面有 n(n 为小于 8 的正整数)个位置已经放上了皇后棋子(相互之间不冲突,合理摆放),现在另外给你 8 - n 个皇后,问你有多少合理的摆法。

输入描述:

一个 8 × 8 的由 0 和 1 组成的矩阵。

输出描述:

一个整数,为摆放的种类数。

样例输入:

1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

样例输出:

4

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=30;
int n,tot;//tot初始化 
int vis[maxn][3];
int C[maxn];
int f[maxn];//f把0到(剩余棋子个数-1)映射到还没有摆放棋子的行 
int k=0;//k表示剩余棋子个数 

void search(int c){//把cur换成c 
	if(c==k) tot++;//cur换成c n换为k 
	else {
		int cur=f[c];//映射 
		for(int i=0;i<8;i++)if(!vis[i][0]&&!vis[cur-i+8][1]&&!vis[cur+i][2]){
			C[cur]=i;
			vis[i][0]=vis[cur-i+8][1]=vis[cur+i][2]=1;
			search(c+1);//cur换成c 
			vis[i][0]=vis[cur-i+8][1]=vis[cur+i][2]=0;
		}
		
	}

}
int main(){
	memset(vis,0,sizeof(vis));
	memset(C,0,sizeof(C));
	memset(f,0,sizeof(f));
	tot=0;
	int x;
	
	for(int i=0;i<8;i++){
	int flag=1;
	for(int j=0;j<8;j++){
		cin>>x;
		if(x==1){
			vis[j][0]=vis[i-j+8][1]=vis[i+j][2]=1;
			flag=0;
		}
		
	}
	if(flag) f[k++]=i;
	}
	
	search(0);
	cout<<tot;
//	system("pause");
	return 0;
} 


猜你喜欢

转载自blog.csdn.net/qq_41093189/article/details/79547694
今日推荐