n后问题

来源:互联网 发布:淘宝3天不发货如何投诉 编辑:程序博客网 时间:2024/05/09 23:38

关键问题:不在同行,同列,斜线上。即对任意两行,!(x[r1]==x[r] || abs(r1-r)==abs(x[r1]-x[r]))。用回溯法,通过此条件进行减枝。

#include <iostream> using namespace std;void print(int *x, int n){int i, j;for(i=0; i<n; i++){for(j=0; j<n; j++){if(x[i]==j)cout<<"1"<<" ";elsecout<<"0"<<" ";}cout<<endl;}cout<<endl;}bool place(int r, int *x){for(int r1=0; r1<r; r1++){if(x[r1]==x[r] || abs(r1-r)==abs(x[r1]-x[r]))return false;}return true;}void backtrack(int r, int* x, int n){if(r==n){print(x, n);return ;}for(int i=0 ;i<n; i++){x[r] = i;if(place(r, x))backtrack(r+1, x, n);}}void nQueen(int n){if(n<4)cout<<"n should be larger than 3."<<endl;int *x = new int[n];int i;for(i=0; i<n; i++)x[n] = 0;backtrack(0, x, n);}int main(){ nQueen(4);return 0;}


原创粉丝点击