n皇后问题

来源:互联网 发布:mac怎么用u盘装双系统 编辑:程序博客网 时间:2024/05/16 19:23

【题目】N皇后问题(含八皇后问题的扩展,规则同八皇后):在N*N的棋盘上,放置N个皇后,要求每一横行每一列,每一对角线上均只能放置一个皇后,问可能的方案及方案数。

代码1:

    #include<stdio.h>    #include<iostream>    #include<algorithm>    #include<string.h>    #include<stack>    using namespace std;    #define N 15    int n; //皇后个数    int sum = 0; //可行解个数    int x[N]; //皇后放置的列数stack<int> S;stack<int> tmp;    int place(int k)    {        int i;        for(i=1;i<k;i++)          if(abs(k-i)==abs(x[k]-x[i]) || x[k] == x[i])            return 0;        return 1;    }    int queen(int t)    {        if(t>n && n>0) //当放置的皇后超过n时,可行解个数加1,此时n必须大于0          {  sum++;   while(!tmp.empty()) tmp.pop();            while(!S.empty())            {                tmp.push(S.top());                S.pop();            }            while(!tmp.empty())            {                printf("%d ",tmp.top());                S.push(tmp.top());                tmp.pop();            }            printf("\n");          }        else          for(int i=1;i<=n;i++)          {              x[t] = i; //标明第t个皇后放在第i列              if(place(t)) //如果可以放在某一位置,则继续放下一皇后               {                S.push(i);                   queen(t+1);S.pop();                   }          }        return sum;    }    int main()    {        while(scanf("%d",&n)!=EOF)        {        int t=0;        sum=0;        memset(x,0,sizeof(x));t = queen(1);        if(n == 0) //如果n=0,则可行解个数为0,这种情况一定不要忽略          t = 0;        printf("%d\n",t);        }        return 0;    }

代码2:

#include<iostream>#include<stdio.h>#include<string.h>#include<stack>using namespace std;const int maxx=100;int visit[maxx][maxx];int fig;int n;stack<int> S;stack<int> tmp;void dfs(int i,int j){    if(visit[i][j]==0)    {        S.push(j);        if(i==n)        {            while(!tmp.empty()) tmp.pop();            while(!S.empty())            {                tmp.push(S.top());                S.pop();            }            while(!tmp.empty())            {                printf("%d ",tmp.top());                S.push(tmp.top());                tmp.pop();            }            printf("\n");            fig++;            S.pop();            return ;        }        int k;        visit[i][j]++;        for(k=1; k<=n; k++)        {            if(k!=i)                visit[k][j]++;            if(k!=j)                visit[i][k]++;        }        k=1;        while(j-k>=1&&i-k>=1)        {            visit[i-k][j-k]++;            k++;        }        k=1;        while(i+k<=n&&j+k<=n)        {            visit[i+k][j+k]++;            k++;        }        k=1;        while(i-k>=1&&j+k<=n)        {            visit[i-k][j+k]++;            k++;        }        k=1;        while(i+k<=n&&j-k>=1)        {            visit[i+k][j-k]++;            k++;        }        for(int g=1; g<=n; g++)        {            dfs(i+1,g);        }        S.pop();        visit[i][j]--;        for(k=1; k<=n; k++)        {            if(k!=i)                visit[k][j]--;            if(k!=j)                visit[i][k]--;        }        k=1;        while(j-k>=1&&i-k>=1)        {            visit[i-k][j-k]--;            k++;        }        k=1;        while(i+k<=n&&j+k<=n)        {            visit[i+k][j+k]--;            k++;        }        k=1;        while(i-k>=1&&j+k<=n)        {            visit[i-k][j+k]--;            k++;        }        k=1;        while(i+k<=n&&j-k>=1)        {            visit[i+k][j-k]--;            k++;        }    }}int main(){    while(scanf("%d",&n)!=EOF)    {        if(n==0)            break;        memset(visit,0,sizeof(visit));        while(!S.empty()) S.pop();        fig=0;        for(int i=1; i<=n; i++)        {            dfs(1,i);        }        printf("%d\n",fig);    }    return 0;}


原创粉丝点击