标题:八皇后回溯法代码问题求指点
只看楼主
以后不要补考
Rank: 1
等 级:新手上路
帖 子:22
专家分:3
注 册:2010-1-30
结帖率:75%
已结贴  问题点数:20 回复次数:7 
八皇后回溯法代码问题求指点
#include<stdio.h>


int checkqueen(int array[][8],int x,int y)//是否自对角线上
{
   
    int i,j;
    int r,t;
    i=x;
    j=y;
    r=x-1;
    t=y-1;

    array[i-1][j-1]=1;
    while(i!=0&&j!=0)
    {
        
        if(array[i-1][j-1]=1)
            return 0;
        i--;
        j--;
    }
    while(r!=0&&t!=8)
    {
        if(array[r-1][t+1]=1)
            return 0;
        r--;
        t++;
    }
    return 1;

}


int checkrow(int array[][8],int x,int y)
{
    int row ;
    for(row=x;row>=0;row++)// 是否在同一列上
    {
        if(array[row][y]=1)
            return 0;
    }
    return 1;


}


int placequeen(int s[][8],int array[][8],int x)
{
    int i,j,t;
    if(x>=7)
    {
        for(i=0;i<8;i++)
        {
            for(j=0;j<8;j++)
            {
                printf("%d ",s[i][j]);
            }
            printf("\n");
        }
    }
    else
    {
        for(t=0;t<8;t++)
        {
            array[x][t]=1;
        if(checkqueen(array,x,t) && checkrow(array,x,t))
          placequeen(s,array,x+1);
        else
        {
        array[x][t]=0;
        }
        }
    }
    return 1;
}
void main ()
{
    int sl[8][8]={0};
    int eq[8][8]={0};
    placequeen(sl,eq,0);
}

搜索更多相关主题的帖子: include return 对角线 while 
2011-08-08 10:47
zerokingf1
Rank: 2
等 级:论坛游民
帖 子:31
专家分:23
注 册:2011-7-30
得分:5 
八皇后。。
2011-08-08 11:19
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
得分:5 
下面的八皇后算法虽然能排出来,但不全,我也懒的改了
程序代码:
/*    

    高斯经典:八皇后问题
    在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,
    即任意两个皇后都不能处于同一行、同一列或同一斜线上,
    问有多少种摆法。
*/




#include <stdio.h>
#define        TRUE        1
#define        FALSE        0

int IsSafe(int col,int row,int queenList[])
{
    int        tempCol, tempRow;
    //只检查前面的行
    for (tempCol = 0; tempCol < col; tempCol ++)
    {
        tempRow = queenList[tempCol];
        if (tempRow == row)
        {
            //同一列
            return FALSE;
        }
        if (tempRow - tempCol == row - col || tempRow + tempCol == row + col)
        {
            return FALSE;
        }
    }
    return TRUE;
}

int PlaceQueue(int queenList[], int col)
{
    int row = 0;
    int FoundPlace = FALSE;
    if (col == 8) //结束标志
    {
        //当处理完第8列的完成
        FoundPlace = TRUE;
    }
    else
    {
        while (row < 8 && !FoundPlace)
        {
            if (IsSafe(col, row, queenList))
            {
                //找到安全位置
                queenList[col] = row;
                //找下一列的安全位置
                FoundPlace = PlaceQueue(queenList, col + 1);
                if (!FoundPlace)
                {
                    row++;
                }
            }
            else
            {
                row++;
            }
        }
    }
    return FoundPlace;
}

void main()
{
    int        queenlist [8];
    int        a, i, j;
    int        res;
    for (j = 0; j < 8; j ++)
    {
        queenlist [0] = j;
        res = PlaceQueue (queenlist, 1);
        if (res)
        {
            for (i = 0; i < 8; i ++)
            {
                for (a = 0; a < 8; a ++)
                {
                    if (i == queenlist [a])
                        printf ("q");
                    else
                        printf ("*");
                }
                printf ("\n");
            }
            printf ("\n");
        }
        else
            printf ("不能完成棋局\n");
    }
}


冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2011-08-08 23:09
loveshuang
Rank: 9Rank: 9Rank: 9
来 自:湖北武汉
等 级:蜘蛛侠
帖 子:270
专家分:1198
注 册:2010-11-14
得分:5 
改了下楼主的程序,抱歉啦,没改出来,自己写的回溯法求八皇后,可以看下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define N 8

typedef struct
{
    int i;
    int j;
}edge;

int pass(int(* p)[N],edge e);
void Search(int(* p)[N],int col);
void print(int(* p)[N]);

int t=0;
int main(void)
{
    int w[N][N];
    memset(w,0,N*N*sizeof(int));

    Search(w,0);

    return 0;
}

void print(int(* p)[N])
{
    int i,j;

    printf("\n第%3d种情况:\n",++t);
   
    for(i=0;i<8;i++)
    {
        for(j=0;j<8;j++)
        {
            if(p[i][j]==1)
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
            FOREGROUND_RED);   //设置颜色
                printf("■");
            }
            else
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
            FOREGROUND_GREEN);  //设置颜色
                printf("□");
            }
        }
        printf("\n");
    }
}

int pass(int(* p)[N],edge e,int row)
{
    for(int i=0;i<row;i++)
        for(int j=0;j<N;j++)
        {
            if(p[i][j]==1)
            {
                if(j==e.j||abs(i-e.i)==abs(j-e.j))
                    return 0;
            }
        }
    return 1;
}

void Search(int(* p)[N],int row)
{
    if(row<N)
    {
        for(int i=0;i<N;i++)
        {
            edge e;
            e.i=row;e.j=i;
            if(pass(p,e,row))
            {
                p[row][i]=1;
                Search(p,row+1);
                p[row][i]=0;
            }
            
        }
    }
    else
        print(p);
}
2011-08-08 23:35
以后不要补考
Rank: 1
等 级:新手上路
帖 子:22
专家分:3
注 册:2010-1-30
得分:0 
回复 3楼 waterstar
谢谢了 。。
2011-08-09 12:56
以后不要补考
Rank: 1
等 级:新手上路
帖 子:22
专家分:3
注 册:2010-1-30
得分:0 
回复 4楼 loveshuang
恩 我在看看的回溯法的吧
2011-08-09 12:56
fragileeye
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:107
专家分:387
注 册:2011-5-21
得分:5 
改了下lz的程序,lz看看吧
#include<stdio.h>

int checkqueen(int array[][8],int x,int y)//是否自同一列或对角线上
{
    int i, j, k;
    for(i = x - 1; i >= 0; i--)
    {
        j =  y - (x - i);
        k = y + (x - i);
        if(array[i][y] == 1 || j >= 0 && array[i][j] == 1 || k < 8 && array[i][k] == 1)
        {
            return 0;      
        }
    }
    return 1;
}

int placequeen(int array[][8],int x)
{
    int i,j,y;
    if(x == 8)
    {
        for(i=0;i<8;i++)
        {
            for(j=0;j<8;j++)
            {
                printf("%d ",array[i][j]);
            }
            printf("\n");
        }
        printf("======================\n");
        getchar();
    }
    else
    {   
        for(y = 0; y < 8; y++)
        {
            array[x][y]=1;
            if(checkqueen(array,x,y))
            {            
                placequeen(array,x+1);
            }      
            array[x][y]=0;
        }
    }
    return 1;
}
int main ()
{
    int eq[8][8]={0};
    placequeen(eq,0);
    return 0;
}
2011-08-09 19:13
以后不要补考
Rank: 1
等 级:新手上路
帖 子:22
专家分:3
注 册:2010-1-30
得分:0 
回复 7楼 fragileeye
谢谢 我已经把自己的给改好了。不过还是要学习下大家的思路。。。
2011-08-09 19:18



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-347052-1-1.html




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

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