回 帖 发 新 帖 刷新版面

主题:[讨论]按吴伟明数据结构书上的方法编了一个求八皇后问题的算法?可不知错在何处,帮帮忙!!

#include "stdio.h"
#include "stdlib.h"

#define N 8
int array[N][N]; //棋盘

int legal(int row,int col)
{
    int i,j;
         //同行是否合法;
    for(i=0;i<=col-1;i++)
    {
        if(array[row][i]==1)return 0;
    }
    for(i=col+1;i<N;i++)
    {
        if(array[row][i]==1)return 0;
    }
         //同列是否合法;
    for(i=0;i<=row-1;i++)
    {
        if(array[i][col]==1)return 0;    
    }
    for(i=row+1;i<N;i++)
    {
        if(array[i][col]==1)return 0;
    }
         //对角线是否合法;    
    i=row-1;
    j=col+1;
    while(i>=0 && j<= N-1)
    {
        if(array[i][j]==1)return 0;
        --i;++j;
    }
    i=row+1;
    j=col-1;
    while((i<=N-1)&&j>=0)
    {
        
        if(array[i][j]==1)return 0;
        ++i;--j;
    }
    i=row-1;j=col-1;
    while(i>=0&&j>=0)
    {
        if(array[i][j]==1)return 0;
        --i;--j;
    }
    i=row+1;j=col+1;
    while((i<=N-1)&&j<=N-1)
    {
        if(array[i][j]==1)return 0;
        ++i;++j;
    }
    return 1;
}

void display()
{
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N;j++)
        {
            printf("%d  ",array[i][j]);
        }
        printf("\n");
    }
}


void Trial(int i)
{
    int j ;
    if(i>=N)display();
    else
    {
        for(j=0;j<=N-1;j++)
        {
            array[i][j] = 1;
            if(legal(i,j)==1) Trial(i+1);
            else array[i][j] = 0;
        }
    }
}


int main()
{
        //初始化数组;
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N;j++)
        {
            array[i][j]=0;
        }
    }
    display();
    printf("\n");
    Trial(0);
    return 0;
}

回复列表 (共3个回复)

沙发


这是我自己写的一个


#include<iostream.h>
#include<math.h>
int n_queens(int *x,int n);
bool place(int *x,int k);
void print(int *x,int n);
void main()
{
    int num;
    cout<<"inpu the number of the queen: ";
    cin>>num;
    int *x=new int[num];
    int sum=n_queens(x,num);
    cout<<"一共有 "<<sum<<" 种放法"<<endl;
    delete[] x;
}
int n_queens(int *x,int n)
{
    int count=0;
    int k=0;
    x[0]=-1;
    while(k>=0)
    {
        x[k]=x[k]+1;
        while((x[k]<=n-1)&&(!place(x,k)))
            x[k]=x[k]+1;
        if(x[k]<=n-1)
        {
            if(k==n-1)
            {
                print(x,n);
                count++;
                cout<<endl<<endl;
            }
            else
            {
                k=k+1;
                x[k]=-1;
            }
        }
        else
        {
            x[k]=-1;
            k=k-1;
        }

    }
    return  count;
}
bool place(int *x,int k)
{
    int i;
    for(i=0;i<k;i++)
        if((x[i]==x[k])||(abs(x[i]-x[k])==abs(i-k)))
            return false;
        return true;
}
void print(int *x,int n)
{
    cout<<"        ";
    int **g=new int *[n];
    int i,j;
    for(i=0;i<n;i++)
        g[i]=new int[n];
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            g[i][j]=-1;
        for(i=0;i<n;i++)
            g[i][x[i]]=x[i];
        char c=1;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                if(g[i][j]>=0)
                    cout<<c<<" ";
                else
                    cout<<"* ";
            }
            cout<<endl;
            cout<<"        ";
        }
        delete[] g;
}

板凳

这个题目
回溯就可以了
没有必要这么麻烦

3 楼

问题已经解决!Thanks!

我来回复

您尚未登录,请登录后再回复。点此登录或注册