首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

【回溯法】n皇后有关问题

2012-10-10 
【回溯法】n皇后问题一。递归回溯#include iostreamusing namespace std#define N 8int sum0int *xnew

【回溯法】n皇后问题

一。递归回溯

#include <iostream>using namespace std;#define N 8int sum=0;int *x=new int[N+1];bool place(int k){int i;for(i=1; i<k; i++){if(x[i]==x[k] || abs(i-k)==abs(x[i]-x[k]))return false;}return true;}void backtrack(int t)//递归回溯{int i=0;if(t>N){for(i=1; i<=N; i++)cout<<x[i]<<" ";cout<<endl;sum++;}else{for(i=1; i<=N; i++){x[t]=i;if(place(t))backtrack(t+1);}}}void main(){backtrack(1);cout<<sum<<endl;}


二。迭代回溯

#include <iostream>using namespace std;#define N 8int sum=0;int *x=new int[N+1];bool place(int k){int i;for(i=1; i<k; i++){if(x[i]==x[k] || abs(i-k)==abs(x[i]-x[k]))return false;}return true;}void backtrack2()//迭代回溯{int i;x[1]=0;int k=1;while(k>0){x[k]+=1;//当前列加1的位置开始搜索while((x[k]<=N) && !place(k))//当前列位置是否满足条件x[k]+=1;//不满足条件,继续搜索下一个位置if(x[k]<=N)//存在满足条件的列{if(k==N)//是最后一个皇后,完成搜索{for(i=1; i<=N; i++)cout<<x[i]<<" ";cout<<endl;sum++;}else//不是,则处理下一个皇后{k++;x[k]=0;}}else//回溯{k--;}}}void main(){backtrack2();cout<<sum<<endl;}



 

热点排行