鱼C论坛

 找回密码
 立即注册
查看: 4698|回复: 11

[争议讨论] 算法每日一个(九)——___回溯法

[复制链接]
发表于 2011-7-12 09:52:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题:应用回溯法求解四皇后问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-12 09:53:35 | 显示全部楼层
本帖最后由 asd82937121 于 2011-7-12 09:54 编辑

不应该是八皇后吗?  L哥的意思是不是 棋盘也变成4*4的了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-7-12 12:00:47 | 显示全部楼层

yes,说的对,本身皇后问题就是在N X N 的棋盘上进行的,对于此类问题的解决办法也不唯一,回溯法只是其中一种。可以考虑下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-12 13:27:58 | 显示全部楼层
直到现在回溯法都不是太明白  自己看了好长时间写出来的还木有反应  真不知道该怎么搞这种算法, L哥能给指点指点么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-12 13:28:48 | 显示全部楼层
最近有点事,都没过来,今天继续、、
/*
**        Slove the 4 queen problem
**        By chao_prince
**        7/12/11
*/

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0

int board[4][4];

void print_board()
{
        int row;
        int column;
        static int n_soluctions;

        n_soluctions += 1;

        printf( "Soluctions #%d:\n", n_soluctions );

        for( row = 0; row < 4; row += 1 )
        {
                for( column = 0; column < 4; column += 1 )
                {
                        if( board[row][column] )
                                printf( " Q" );
                        else
                                printf( " +" );
                }
                putchar( '\n' );
        }
        putchar( '\n' );
}

int conflicts( int row, int column )
{
        int i;

        for( i = 1; i < 4; i++ )
        {
                if( row - i >= 0 && board[row-i][column] )
                        return TRUE;
                if( column - i >= 0 && board[row][column-i] )
                        return TRUE;
                if( column + i < 4 && board[row][column+i] )
                        return TRUE;

                if( row - i >= 0 && column - i >= 0 
                        && board[row-i][column-i] )
                        return TRUE;
                if( row - i >= 0 && column + i < 4 
                        && board[row-i][column+i] )
                        return TRUE;
        }
        return FALSE;
}

void place_queen(int row)
{
        int column;
        
        for( column = 0; column < 4; column += 1 )
        {
                board[row][column] = TRUE;
                if( row == 0 || !conflicts(row, column) )
                {
                        if( row < 3 )
                                place_queen(row+1);
                        else
                                print_board();
                }
                board[row][column] = FALSE;
        }
}

int main()
{
        place_queen(0);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-13 23:27:14 | 显示全部楼层
等 这几天忙完了  回来好好看一遍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-20 22:59:58 | 显示全部楼层
本帖最后由 紫色枫叶 于 2011-7-20 23:09 编辑
chao_prince 发表于 2011-7-12 13:28
最近有点事,都没过来,今天继续、、

恩,这个算法是经典算法,记得以前学java的时候看过。差不多都还给老师了。经你这么一写,醍醐灌顶。我在你的代码基础上稍微做了些修改。
#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0

int **board;

void print_board(int n)
{        
    int row;
    int column;
    static int n_soluctions;
    n_soluctions += 1;
    printf( "Soluctions #%d:\n", n_soluctions );
    for( row = 0; row < n; row += 1 )
    { 
         for( column = 0; column < n; column += 1 )
        {
            if( board[row][column] )
               printf( " Q" );
            else
                printf( " +" );
        }
                putchar( '\n' );
    }
    putchar( '\n' );
}

int conflicts(int row, int column, int n)
{

    int i;
    for( i = 1; i < n; i++ )
    {
        if(row - i >= 0 && board[row-i][column])           
            return TRUE;
        if(column - i >= 0 && board[row][column-i])
            return TRUE;
        if(column + i < n && board[row][column+i])
            return TRUE;
        if(row - i >= 0 && column - i >= 0 
            && board[row-i][column-i])
                        return TRUE;
        if(row - i >= 0 && column + i < n 
            && board[row-i][column+i])
            return TRUE;
    }
    return FALSE;
}

void place_queen(int row, int n)
{
    int column;
    for(column = 0; column < n; column += 1)
    {        
        board[row][column] = TRUE;
        if(row == 0 || !conflicts(row, column, n))
        {                                                    
            if(row < n - 1)
                place_queen(row+1, n);
            else
               print_board(n);
        }
        board[row][column] = FALSE;
    }
}

int main(int argc, char **argv)
{
        printf("请输入皇后数(偶数):");
        int n = 0;
        scanf("%d", &n);
        board = new int*[n];
        for(int i = 0; i < n; i++)
        {
                board[i] = new int[n];
        }
        
        for(int i = 0; i < n; i++)
        {
                for(int j = 0; j < n; j++)
                        board[i][j] = FALSE;
        }
        place_queen(0, n);
        for(int i = 0; i < n; i++)
        {
               delete [] board[i];
               board[i] = NULL;
        }
        delete []board;
        board = NULL;
        system("pause");
        return 0;
}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-11-1 18:39:13 | 显示全部楼层
学习学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-9-9 12:17:11 | 显示全部楼层
一起加油,为了鱼C美好的明天!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-16 20:29:02 | 显示全部楼层
学习学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-17 08:53:44 | 显示全部楼层
好文章转过来方便自己看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-2 16:17:35 | 显示全部楼层
学习学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 03:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表