题目网上可以搜索到,直接给出程序,程序很简单。
backtrack.h
#pragma once
#include<iostream>
#include<vector>
using namespace std;
struct P
{
int x;
int y;
P():x(0),y(0){}
};
class Backtrack
{
public:
Backtrack(int m);
void place(int i);
bool right(int i);
void show();
private:
int n;
int n_sum;
vector<P> Position;
};
backtrack.cpp
#include "stdafx.h"
#include"backtrack.h"
#include<iostream>
#include<vector>
using namespace std;
Backtrack::Backtrack(int m)
{
n=m;
n_sum=0;
Position.resize(n+1);
Position[0].x=0;
Position[0].y=0;
}
void Backtrack::place(int i)
{
if(i>n)
{
++n_sum;
for(int j=1;j<Position.size();j++)
cout<<"("<<Position[j].x<<","<<Position[j].y<<")"<<" ";
cout<<endl;
}
else
{
for(int j=1;j<=n;j++)
{
Position[i].x=i;
Position[i].y=j;
if(right(i))
place(i+1);
}
}
}
bool Backtrack::right(int i)
{
for(int k=1;k<i;k++)
{
if((Position[k].x==Position[i].x)||(Position[k].y==Position[i].y)||(abs(Position[k].x-Position[i].x)==abs(Position[k].y-Position[i].y)))
return false;
}
return true;
}
void Backtrack::show()
{
cout<<"坐标:"<<endl;
place(1);
cout<<"总数:"<<endl;
cout<<n_sum<<endl;
}
Algorithm-backtrack2.cpp
// Algorithm-backtrack2.cpp : 定义控制台应用程序的入口点。
//
//回溯算法解决n后问题
#include "stdafx.h"
#include"backtrack.h"
#include<iostream>
#include<vector>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
Backtrack b(5);
b.show();
return 0;
}