八皇后問題

??八皇后問題是一個(gè)以國(guó)際象棋為背景的問題:如何能夠在 8×8 的國(guó)際象棋棋盤上放置八個(gè)皇后,使得任何一個(gè)皇后都無法直接吃掉其他的皇后?為了達(dá)到此目的,任兩個(gè)皇后都不能處于同一條橫行、縱行或斜線上。八皇后問題可以推廣為更一般的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 皇后問題個(gè)數(shù) 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) {
        // 找到了一個(gè)解
        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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 問題描述: 八皇后問題是一個(gè)以國(guó)際象棋為背景的問題:如何能夠在8×8的國(guó)際象棋棋盤上放置八個(gè)皇后,使得任何一個(gè)皇后...
    LeeYunFeng閱讀 917評(píng)論 0 51
  • 如果確定要去一個(gè)地方,就盡早買票。盡早買票,可以了解交通方式、時(shí)刻、耗時(shí),可以有票,可以有好的位置,而且一般都還更...
    莫負(fù)今朝閱讀 481評(píng)論 0 0
  • 35歲就這樣來到了。接到家里打來的電話,我突然意識(shí)到,人生已經(jīng)過了上半場(chǎng)。在這中場(chǎng)哨響時(shí)刻,我突然五味雜陳。 35...
    skiptolau閱讀 604評(píng)論 0 50
  • 趙宇是A市的一名美食專欄作家,有一次在瀏覽美食專欄網(wǎng)頁時(shí)彈出一則新聞,新聞上說在A市月亮湖的天空上出現(xiàn)了海市蜃樓。...
    Stephanus閱讀 398評(píng)論 1 2

友情鏈接更多精彩內(nèi)容