用回溯法解决八数码问题(不要递归的)
用回溯法解决八数码问题(不要递归的)
程序代码:
【原创】试探法求解N皇后问题C++编程 2010-06-01 20:39:21 阅读9 评论0 字号:大中小 终于让我给想出来了!哈哈! #include <iostream> #include <cmath> using namespace std; class Queen { public: Queen(int n); void Print(); void Move(int m); void Fill1(int data); void Fill0(); public: int ci; int num; int qipan[20+1][20+1]; int pt[20+1]; }; Queen::Queen(int n) { ci=0; pt[0]=0; num=n; for(int i=1;i<=num;i++) for(int j=1;j<=num;j++) qipan[i][j]=0; Move(1); } void Queen::Fill0() { for(int i=1;i<=num;i++) for(int j=1;j<=num;j++) if(qipan[i][j]==pt[0]) qipan[i][j]=0; } void Queen::Fill1(int data) { int hang=pt[0]; int lie=pt[pt[0]]; int i; for(i=1;i<=num;i++) { if(qipan[hang][i]==0) qipan[hang][i]=data; if(qipan[i][lie]==0) qipan[i][lie]=data; } if(hang+lie<=num) { for(i=1;i<=hang+lie-1;i++) if(qipan[hang+lie-i][i]==0) qipan[hang+lie-i][i]=data; } else { for(i=(hang+lie)%num;i<=num;i++) if(qipan[hang+lie-i][i]==0) qipan[hang+lie-i][i]=data; } if(hang>lie) { for(i=1;i<=num-hang+lie;i++) if(qipan[hang-lie+i][i]==0) qipan[hang-lie+i][i]=data; } else { for(i=1+lie-hang;i<=num;i++) if(qipan[hang-lie+i][i]==0) qipan[hang-lie+i][i]=data; } } void Queen::Move(int m) { pt[0]++; for(int i=1;i<=num;i++) { if(qipan[m][i]==0) { pt[pt[0]]=i; Fill1(pt[0]); Move(m+1); } } Print(); { pt[0]--; Fill0(); m=pt[0]; } } void Queen::Print() { if(pt[0]>num) { ci++; cout<<"第"<<ci<<"种解法:"<<endl; for(int i=1;i<=num;i++) { for(int j=1;j<=num;j++) { if(j==pt[i]) cout<<"@ "; else cout<<"* "; } cout<<endl; } } } int main() { Queen q(9); return 0; }你看看是不是你想要的。