hdu2553

来源:互联网 发布:hough算法检测直线 编辑:程序博客网 时间:2024/06/12 00:31

先是之前的八皇后问题

回溯法

输出八皇后的每一种情况,共92种

#include <iostream>#include <cstring>#include <cmath>using namespace std;int mp[1005],ans,coutt[1005][1005];void is(int x){    if(x==8)        {            ans++;            memset(coutt,0,sizeof(coutt));            cout<<"No. "<<ans<<endl;            for(int i=0;i<8;i++)//为了输出                coutt[mp[i]][i]=1;            for(int i=0;i<8;i++)            {                for(int j=0;j<8;j++)                {                    cout<<coutt[i][j]<<" ";                    if(j==7)                        cout<<endl;                }            }}        else    for(int i=0;i<8;i++)    {        int ok=1;        mp[x]=i;        for(int j=0;j<x;j++)//判断是否与之前的矛盾        {            if(mp[j]==i||abs(mp[j]-i)==abs(j-x))//显然不同行了,再判断是否同列,同斜只需判断,行减行是否等于列减列                {                ok=0;break;//如果矛盾,标记一下,退出,继续搜本行的下一列                }        }        if(ok)        {            is(x+1);//继续找下一行,找到最后一行的时候,退出,又会回到第i行,继续判断其他情况        }    }}int main(){    is(0);        return 0;}
n皇后问题,只需要将八换成n,统计每个n多少种情况

#include <iostream>#include <cstring>#include <cmath>using namespace std;int mp[1005],n,ans;void is(int x){    if(x==n)        ans++;        else    for(int i=0;i<n;i++)    {        int ok=1;        mp[x]=i;        for(int j=0;j<x;j++)        {            if(mp[j]==i||abs(mp[j]-i)==abs(j-x))                {                ok=0;break;                }        }        if(ok)        {            is(x+1);        }    }}int main(){    while(cin>>n&&n)    {        memset(mp,0,sizeof(mp));        ans=0;        is(0);        cout<<ans<<endl;    }        return 0;}


0 0
原创粉丝点击