回溯法之N后问题

参考:http://www.cnblogs.com/hustcat/archive/2008/04/09/1144645.html

N后问题的描述:在N*N的方格中,放置N个皇后使得彼此不受攻击,即任意两个皇后不能在同一行、同一列或者同一条对角线上。

典型的搜索图:

典型的问题是八皇后问题:

 代码:

#include "stdafx.h"
#include<iostream>
using namespace std;

#define N  9
int x[N+1];

//输出结果
void Output()
{
    for(int i=1;i<=N;i++)
    {
		cout<<"("<<i<<","<<x[i]<<")"<<endl;
    }
    printf("\n");
}

//求解函数
void Queen(int i,int n)
{
    if(i>n)
        Output();
    else
    {
        for(int j=1;j<=n;++j)
        {
            int k=1;
			x[i]=j;
            while(k<i)
            {
				if((x[k]-x[i])*(abs(x[k]-x[i])-abs(k-i))!=0)
                {
                    k++;
                    if(k==i)
                        Queen(i+1,n);
                }
                else
                {
                    break;
                }
            }
        }
    }
}
int _tmain(int argc, _TCHAR* argv[])
{
	 for(int i=1;i<=N;i++)
	 {
		x[1]=i; //设置第一行
        Queen(2,N);
	 }
	return 0;
}
原文地址:https://www.cnblogs.com/fistao/p/3119533.html