| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 612 人关注过本帖
标题:八阶皇后问题求解
只看楼主 加入收藏
fdcumt
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-9-16
结帖率:0
收藏
已结贴  问题点数:0 回复次数:8 
八阶皇后问题求解

求大能把下面的程序分析一下,为什么我的程序用vs2010只能打印出十二个八阶皇后,用vc6.0却打印出三十个 但是不是从第一个开始,程序那出毛病了,求指点!!!急呀!!
#include <iostream>
#include <iomanip>
using namespace std;
void setCondition(bool *m,int n);//对状态进行设置
void row(bool *r,int i,int j,int n); //判断该行是否可以放皇后
void xie(bool *r,int i,int j,int n);
void obxie(bool *r,int i,int j,int n);
void obRow(bool *r,int i,int j,int n);//清除上一组数据
void obDiagonal(bool *d,int i,int j,int n);//清除上一组数据
void diagonal(bool *d,int i,int j,int n);//判断此正反斜对角线是否可以放皇后
void solve(bool *r,bool *d,bool *o,int i,int j,int *t,int n);//进行皇后放置
void print(int *t,int n );//进行打印
int z=0;
int main()
{
        int i,j,n;

        cout<<"请输入皇后阶数!"<<endl;
        cin>>n;

        int  *t=new int  [n];
        bool *r=new bool [n];
        bool *d=new bool [2*n-1];
        bool *o=new bool [2*n-1];

        setCondition(r,n);
        setCondition(d,2*n-1);
        setCondition(o,2*n-1);

        i=0; j=0;
        solve(r,d,o,i,j,t,n);

        delete []t;
        delete []r;
        delete []d;
        delete []o;


        return 0;
}
void xie(bool *d,int i,int j,int n)
{
        d[j+i]= false;
}
void obxie(bool *d,int i,int j,int n)
{
        d[j+i]= true;
}
void setCondition(bool *m,int n)
{
        int i;
        for (i=0;i<n;i++)
        {
                m[i]=true;
        }
}
void row(bool *r,int i,int j,int n)
{
        r[i]=false;
}
void obRow(bool *r,int i,int j,int n)
{
        r[i]=true;
}
void diagonal(bool *d,int i,int j,int n)
{
        d[i-j+n-1]= false;
}
void obDiagonal(bool *d,int i,int j,int n)
{
        d[i-j+n-1]= true;
}
void print(int *t,int n )
{
        int i,j;

        for (i=0;i<n;i++)
        {
                for (j=0;j<n;j++)
                {
                        if (i==t[j])
                        {
                                cout<<setw(3)<<'Q';
                        }
                        else cout<<setw(3)<<'+';
                }

                cout<<endl;
        }
        z++;
        cout<<z<<endl;
}
void solve(bool *r,bool *d,bool *o,int i,int j,int *t,int n)
{
        if(i==n&&j==0) exit(0);

        if (j==n)
        {
                cout<<endl;
                print(t,n);

                obDiagonal(d,t[j-1],j-1,n);
                obxie(o,t[j-1],j-1,n);
                obRow(r,t[j-1],j-1,n);
                solve(r,d,o,t[j-1]+1,j-1,t,n);
        }

        if (i==n)
        {
                obDiagonal(d,t[j-1],j-1,n);
                obxie(o,t[j-1],j-1,n);
                obRow(r,t[j-1],j-1,n);
                solve(r,d,o,t[j-1]+1,j-1,t,n);

        }
        if (r[i]&&d[i-j+n-1]&&o[i+j])
        {
                t[j]=i;
                diagonal(d,i,j,n);
                xie(o,i,j,n);
                row(r,i,j,n);

                solve(r,d,o,0,j+1,t,n);
        }
        else
        {
                solve(r,d,o,i+1,j,t,n);
        }

}


搜索更多相关主题的帖子: 分析 include using 
2011-10-20 16:50
nomify
Rank: 5Rank: 5
等 级:职业侠客
帖 子:79
专家分:366
注 册:2011-10-13
收藏
得分:20 
你的运行到49个时程序就挂了。
还有改一下控制台窗口屏幕缓冲区高度就可以全部显示了。

[ 本帖最后由 nomify 于 2011-10-20 20:46 编辑 ]
2011-10-20 20:42
nomify
Rank: 5Rank: 5
等 级:职业侠客
帖 子:79
专家分:366
注 册:2011-10-13
收藏
得分:0 
我也写了一个。
程序代码:
#include <iostream>
#include <cmath>
using namespace std;

int count;

bool IsSafe(int **table,int x,int y)
{
    for(int i=0; i<x; i++)
    {
        if( y==table[i][1] || abs(x-table[i][0])==abs(y-table[i][1] ))
            return false;
    }
    return true;
}

void print(int **table,int m)
{
    count++;
    cout << count << endl;
    for(int i=0; i<m; i++)
    {
        for(int j=0; j<m; j++)
        {
            cout << "  ";
            if(i==table[i][0] && j==table[i][1])
                cout << 'Q';
            else
                cout << '+';
        }
        cout<<endl;
    }
    cout << endl;
}

void trial(int ** &table,int n,int m)
{
    if(n>=m)
        print(table,m);
    else for(int i=0; i<m; i++)
        {
            if(IsSafe(table,n,i))
            {
                table[n][0]=n;
                table[n][1]=i;
                trial(table,n+1,m);
            }
        }
}
int main()
{
    int m,* *table;
    cout<<"请输入皇后阶数:";
    cin>>m;
    table = new int *[m];
    for(int i=0; i<m; i++)
        table[i] = new int[2];
    trial(table,0,m);
    for(i=0; i<m; i++)
        delete table[i];
    delete table;
    return 0;
}



[ 本帖最后由 nomify 于 2011-10-20 20:54 编辑 ]
2011-10-20 20:49
fdcumt
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-9-16
收藏
得分:0 
回复 2楼 nomify
怎么改呀
2011-10-20 22:23
nomify
Rank: 5Rank: 5
等 级:职业侠客
帖 子:79
专家分:366
注 册:2011-10-13
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

2011-10-20 22:28
fdcumt
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-9-16
收藏
得分:0 
不是控制台的事
纸打印到十二个就停止了
是程序运行的事
但是哪错了呀
找不到呀
而且vc6.0和vs2010运行结果不一致
vs2010打印的结果
图片附件: 游客没有浏览图片的权限,请 登录注册


这个是vc6.0[local]2[/local]
2011-10-20 23:36
fdcumt
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-9-16
收藏
得分:0 
不是控制台的事
纸打印到十二个就停止了
是程序运行的事
但是哪错了呀
找不到呀
而且vc6.0和vs2010运行结果不一致
vs2010打印的结果
图片附件: 游客没有浏览图片的权限,请 登录注册



这个是vc6.0
图片附件: 游客没有浏览图片的权限,请 登录注册
2011-10-20 23:40
nomify
Rank: 5Rank: 5
等 级:职业侠客
帖 子:79
专家分:366
注 册:2011-10-13
收藏
得分:0 
程序本身确实也有问题。
2011-10-21 10:10
fdcumt
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-9-16
收藏
得分:0 
已经改完了,不是程序的问题,呵呵,不管怎么说,还是谢谢你!!!
2011-10-21 19:25
快速回复:八阶皇后问题求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031064 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved