LeetCode51 -- iOS使用OC写算法之递归实现N皇后

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。


输入:n = 4输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]


_cols、_pie、_na为攻击范围

_pie中数据的关系:行+列等于一个常数

_na中数据的关系:行 - 列等于一个常数

上代码:

定义全局变量:

NSMutableArray *_result;

    NSMutableArray *_cols;

    NSMutableArray *_pie;

    NSMutableArray *_na;

具体实现:

-(NSArray *)solveNQueens {

    int n = 4;

    if (n < 1) {

        return @[];

    }

    _result = [NSMutableArray new];

    /** 列 */

    _cols = [NSMutableArray new];

    /** 丿 */

    _pie = [NSMutableArray new];

    /** 捺 */

    _na = [NSMutableArray new];

    [self solveNQueensWidhDFS:n row:0 cur_state:[NSMutableArray new]];


    return [self _generate_result:n];


}

-(void)solveNQueensWidhDFS:(int)n row:(int)row cur_state:(NSMutableArray *)cur_state {

    if (row >= n) {

        [_result addObject:cur_state];

        return;

    }

    for (int col = 0; col < n; col ++) {

        if ([_cols containsObject:@(col)] || [_pie containsObject:@(row + col)] || [_na containsObject:@(row - col)]

            ) {

            continue;

        }

        [_cols addObject:@(col)];

        [_pie addObject:@(row + col)];

        [_na addObject:@(row - col)];


        NSMutableArray *c = [NSMutableArray new];

        [c addObjectsFromArray:cur_state];

        [c addObject:@(col)];

        [self solveNQueensWidhDFS:n row:row + 1 cur_state:c];


        [_cols removeObject:@(col)];

        [_pie removeObject:@(row + col)];

        [_na removeObject:@(row - col)];

    }

}

-(NSArray *)_generate_result:(int)n {

    NSMutableArray *board = [NSMutableArray new];

    for (NSArray *res in _result) {

        for (NSNumber *i in res) {

            NSString *point1 = [self string:i.intValue];

            NSString *point2 = [self string:n - i.intValue - 1];

            NSString *q = [NSString stringWithFormat:@"%@%@%@",point1,@"Q",point2];

            [board addObject:q];

        }

    }

    return board;

}

-(NSString *)string:(int)num {

    NSString *string = @"";

    for (int i = 0; i < num; i ++) {

        string = [string stringByAppendingString:@"."];

    }

    return string;

}

leetcode链接:https://leetcode-cn.com/problems/n-queens/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 52. N皇后 II N皇后 IIn 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之...
    leacoder阅读 390评论 0 1
  • 字符串反转 //调用 char cha[] = "hello,word"; char_reverse(cha); ...
    Li_Po阅读 431评论 0 2
  • 题目描述 n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击(任意两个皇后不能位于同一行,同一列...
    CW不要无聊的风格阅读 182评论 0 0
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile丽语阅读 4,079评论 0 6
  • 晚上下班回来经常盯着手机屏幕发呆,就想写点什么,打发下漫长的夜晚,并记录下工作中的点点滴滴。 1.tablevie...
    so_what阅读 1,910评论 3 5

友情链接更多精彩内容