八皇后问题之二

原创 2016年05月31日 22:59:55

上节讲到各方向的遍历,现在给出完整的结果。。。。。

 //判断左下方
    for(i=row,k=j;i<4&&k>=0;i++,k--)
    {
        if(*(*(chess+i)+k)!=0)
        {
            flag5 = 1;
            break;
        }
    }
    if(flag1||flag2||flag3||flag4||flag5)
    {
        return 0;
    }
    else
    {
        return 1;
    }

}



----------


> 计算出一共有多少种方式

 //row表示起始行
//n表示列
//(*chess)[4] 表示指向棋盘每一行的指针
void FourQueen(int row,int n,int (*chess)[4])
{
    int chess2[4][4],i,j;
    for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            chess2[i][j]=chess[i][j];
        }
    }
    if(row == 4)
    {
        printf("第%d种",count+1);
        printf("\n");
        for(i=0;i<4;i++)
        {
            for(j=0;j<4;j++)
            {
                printf("%d ",*(*(chess2+i)+j));
            }
            printf("\n");
        }
        printf("\n");
        count++;
    }
    else
        {
            for(j=0;j<n;j++)
            {
                if(notDanger(row,j,chess))//判断是否危险
                {
                    for(i=0;i<4;i++)
                    {
                     *(*(chess2+row)+i) = 0;
                    }
                    *(*(chess2+row)+j) = 1;
                    FourQueen(row+1,n,chess2);
                }
            }
        }

}

下面给出源代码

源码

#include <stdio.h>
#include <stdlib.h>
int count = 0;
int notDanger(int row,int j,int (*chess)[4])
{
    int i,k,flag1 = 0,flag2 = 0,flag3 = 0,flag4 = 0,flag5 = 0;
    //判断方向
    for(i=0;i<4;i++)
    {
        if(*(*(chess+i)+j)!=0)//*(chess+i)+j是第i行第j列元素的地址,*(*(chess+i)+j)是第i行第j列元素所对应的值
        {
            flag1 = 1;
            break;
        }
    }
    //判断左上方
    for(i=row,k=j;i>=0&&k>=0;i--,k--)
    {
        if(*(*(chess+i)+k)!=0)
        {
            flag2 = 1;
            break;
        }
    }
    //判断右下方
    for(i=row,k=j;i<4&&k<4;i++,k++)
    {
        if(*(*(chess+i)+k)!=0)
        {
            flag3 = 1;
            break;
        }
    }
     //判断右上方
    for(i=row,k=j;i>=0&&k<4;i--,k++)
    {
        if(*(*(chess+i)+k)!=0)
        {
            flag4 = 1;
            break;
        }
    }
    //判断左下方
    for(i=row,k=j;i<4&&k>=0;i++,k--)
    {
        if(*(*(chess+i)+k)!=0)
        {
            flag5 = 1;
            break;
        }
    }
    if(flag1||flag2||flag3||flag4||flag5)
    {
        return 0;
    }
    else
    {
        return 1;
    }

}
//row表示起始行
//n表示列
//(*chess)[4] 表示指向棋盘每一行的指针
void FourQueen(int row,int n,int (*chess)[4])
{
    int chess2[4][4],i,j;
    for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            chess2[i][j]=chess[i][j];
        }
    }
    if(row == 4)
    {
        printf("第%d种",count+1);
        printf("\n");
        for(i=0;i<4;i++)
        {
            for(j=0;j<4;j++)
            {
                printf("%d ",*(*(chess2+i)+j));
            }
            printf("\n");

        }
        printf("\n");
        count++;
    }
    else
        {
            for(j=0;j<n;j++)
            {

                if(notDanger(row,j,chess))//判断是否危险
                {
                    for(i=0;i<4;i++)
                    {
                     *(*(chess2+row)+i) = 0;
                    }
                    *(*(chess2+row)+j) = 1;
                    FourQueen(row+1,n,chess2);
                }
            }
        }

}
int main()
{
    int chess[4][4],i,j;
    for(i=0;i<4;i++)
    {

        for(j=0;j<4;j++)
        {
            chess[i][j] = 0;
        }
    }
    FourQueen(0,4,chess);
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

八皇后问题(二)

1、八皇后问题(二) 思路:我们采取回溯的方法来解决,还是那样表示,比如数组a, a[1]  = 8;表示这个放在第一行第八列 2、代码实现: #include #include /* *采用...

八皇后及其拓展问题

  • 2017年12月02日 14:41
  • 181KB
  • 下载

利用c++解决八皇后问题

  • 2017年11月27日 23:51
  • 784B
  • 下载

八皇后问题(最简单的递归解法)

题目 原文: Write an algorithm to print all ways of arranging eight queens on a chess board so that...

八皇后问题源码 python

  • 2017年12月04日 18:52
  • 6KB
  • 下载

八皇后问题的C++实现

  • 2017年09月23日 08:39
  • 446KB
  • 下载

用回溯法解决八皇后问题(Java实现)

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同...

八皇后问题

  • 2015年12月14日 16:22
  • 119KB
  • 下载

八皇后问题

  • 2015年07月07日 18:13
  • 36KB
  • 下载

回溯法和栈的思想用于“八皇后问题”的求解

八皇后问题是一个经典的问题,其核心是:在n*n的棋盘上,有n个皇后,这些皇后必须位于不同行不同列上,并且不能处于同一对角线上,否则会因相互攻击而死亡。那么如何安排皇后们的位置呢? 我们可以利用回溯法,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:八皇后问题之二
举报原因:
原因补充:

(最多只允许输入30个字)