赞
踩
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上)。你的任务是,对于给定的N,求出有多少种合法的放置方法。
要求利用栈的操作解决此问题。借此熟悉栈的相关操作。思想方法仍然是回溯。
- #include <iostream>
- #include <cmath>
- using namespace std;
- typedef struct
- {
- int data[20];
- int top;
- } SqStack;
- bool judge_place(int *data,int k)
- {
- int i;
- for(i=1; i<k; ++i)
- if(data[k]==data[i]||abs(data[k]-data[i])==abs(k-i))
- return false;
- return true;
- }
- void print(int *data,int n)
- {
- int i,j;
- for(i=1; i<=n; ++i)
- {
- for(j=1; j<data[i]; ++j)
- cout<<'*';
- cout<<'Q';
- for(j=data[i]+1; j<=n; ++j)
- cout<<'*';
- cout<<endl;
- }
- cout<<endl;
- }
- int main()
- {
- SqStack st;
- int n,ans=0;
- st.top=1;
- st.data[st.top]=0;
- cin>>n;
- while(st.top>0)
- {
- ++st.data[st.top];
- while(st.data[st.top]<=n&&!judge_place(st.data,st.top))
- ++st.data[st.top];
- if(st.data[st.top]==n+1)//找到第n个仍然不符合
- {
- st.data[st.top]=0;//当前行的棋子位置置为0
- --st.top;//当前行退栈
- continue;
- }
- if(st.top==n)//找到一个答案
- {
- print(st.data,n);
- ++ans;
- --st.top;//退回到倒数第二行继续尝试
- }
- else//当前行找到可以放的位置
- {
- ++st.top;//下一行进栈
- st.data[st.top]=0;
- }
- }
- cout<<"total: "<<ans<<" ans";
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。