xynuoj 1276: N皇后问题

题目描述

在N*N(1<N<=9)的棋盘上放置N个皇后而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置2个皇后),编程求解所有的摆放方法。

输入

一个整数n(1<n<=9)
输出

若有解,输出若干行,每行n个数,中间有两个空格,依次表示第i个皇后的列号
若无解,输出 “no”
样例输入

4
样例输出

2 4 1 3
3 1 4 2
代码里面有注释,回溯法的应用

#include<iostream>
#include<cmath>
#include<stdio.h>
#include<algorithm>
using namespace std;
int x[105];//x[i]=y;表示第i个皇后(当然第i个皇后也在第i行)在第i行的第y列 
int n,num;
int place(int t)//判断现在皇后的位置是否与前面的皇后位置有冲突 
{
	for(int i=1;i<t;i++)
	{
		if(x[i]==x[t]||t-i==abs(x[i]-x[t]))// x[i]==x[t]表示在同一列, t-i==abs(x[i]-x[t])表示在斜对角 
		{
			return 0;
			break;
		}
	}
	return 1;
}
void BackTrace(int t)
{
	if(t>n)
	{
	  num++;
	  for(int i=1;i<n;i++)
	  cout<<x[i]<<" ";
	  cout<<x[n]<<endl;	
	}
	else
	{
		for(int i=1;i<=n;i++)
		{
			x[t]=i;
			if(place(t)==1)
			BackTrace(t+1);
		}
	}
}
int main()
{
	while(scanf("%d",&n)!=EOF)
	{
		 num=0;
		 BackTrace(1);
		 if(num==0)
		 cout<<"no"<<endl;
	}	
} 

猜你喜欢

转载自blog.csdn.net/lemon1090/article/details/89461447