美文网首页
八皇后问题

八皇后问题

作者: 雪中夜归人 | 来源:发表于2019-11-05 15:10 被阅读0次

  八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题。

#import "JYCnQueens.h"

@interface JYCnQueens ()

@property (nonatomic, copy) NSMutableDictionary *queensColDic;

@property (nonatomic, assign) NSInteger maxQueens;

@property (nonatomic, assign) NSInteger resultCount;

@end

@implementation JYCnQueens

/// n皇后问题解法
/// @param queenCount 皇后问题个数 n
- (void)findQueen:(NSInteger)queenCount
{
    self.maxQueens = queenCount;
    self.resultCount = 0;
    [self find:0];
    NSLog(@"%ld皇后问题有%ld种解",self.maxQueens,self.resultCount);
}

- (void)find:(NSInteger)queenCount
{
    if (queenCount >= self.maxQueens) {
        // 找到了一个解
        self.resultCount++;
        [self showResult];
        return;
    }
    for (NSInteger row = 0; row < self.maxQueens; row++) {
        if ([self canPutHerCol:queenCount row:row]) {
            self.queensColDic[@(queenCount)] = @(row);
            [self find:queenCount + 1];
            [self.queensColDic removeObjectForKey:@(queenCount)];
        }
    }
}

- (void)showResult
{
    for (NSInteger i = 0; i < self.queensColDic.count; i++) {
        NSInteger putRow = [self.queensColDic[@(i)] integerValue];
        NSMutableArray *rowArray = [NSMutableArray array];
        for (NSInteger j = 0; j < self.queensColDic.count; j++) {
            if (j == putRow) {
                [rowArray addObject:@"1"];
            } else {
                [rowArray addObject:@"0"];
            }
        }
        NSString *rowStr = [rowArray  componentsJoinedByString:@"  "];
        NSLog(@"%@\n",rowStr);
    }
    NSLog(@"------------------------");
}

- (BOOL)canPutHerCol:(NSInteger)col row:(NSInteger)row
{
    for (NSInteger currentCol = 0;currentCol < self.queensColDic.count; currentCol++) {
        NSInteger currentRow = [self.queensColDic[@(currentCol)] integerValue];
        if (currentRow == row || currentCol == col) {
            return NO;
        }
        if (labs(row - currentRow) == labs(currentCol - col)) {
            return NO;
        }
    }
    return YES;
}

- (NSMutableDictionary *)queensColDic
{
    if (!_queensColDic) {
        _queensColDic = [NSMutableDictionary dictionary];
    }
    return _queensColDic;
}

@end

相关文章

  • 11.数据结构—八皇后问题(回溯法)

    11.1 八皇后问题 八皇后问题是以国际象棋为背景的问题:有八个皇后(可以当成八个棋子),如何在 88 的棋盘中放...

  • 算法(03)回溯

    八皇后问题

  • 八皇后问题(N皇后问题)

    八皇后问题是一个经典的递归回溯问题。 描述 八皇后问题是在一个 8*8 的棋盘上放置皇后,要求其放置后满足同一行,...

  • 八皇后问题

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在...

  • 八皇后问题

    问题的类别是回溯(backtrace). 回溯通常用递归实现。回溯中注意边界问题,避免越界。同时,剪枝可以减少ca...

  • 八皇后问题

    课堂上老师讲了广度优先搜索算法后让课下实现下八皇后问题,就突发奇想了很多实现方法,这里只把我的实现方式和实现代码粘...

  • 八皇后问题

    问题 八皇后问题是一个古老而著名的问题,是试探法的典型例题。该问题由19世纪数学家高斯1850年手工解决。原题为在...

  • 八皇后问题

    采用试探回溯策略,通过栈记录查找结果,实现八皇后问题求解。 测试代码

  • 八皇后问题

    如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任两个皇后都不能处于同一条横行、纵行或斜线上。 先从第一列开...

  • 八皇后问题

    问题描述: 在8x8的网格上,放置皇后两个皇后,两个皇后之间不能在同一行,也不能在同一列,也不能在对角线上。 cl...

网友评论

      本文标题:八皇后问题

      本文链接:https://www.haomeiwen.com/subject/jbasbctx.html