美文网首页
LeetCode51 -- iOS使用OC写算法之递归实现N皇后

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

作者: 多肉肉 | 来源:发表于2021-11-15 00:31 被阅读0次

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/

相关文章

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

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

  • 使用OC写算法之递归实现八皇后

    八皇后算法介绍 知道国际象棋的朋友们应该知道里面的皇后是最厉害的角色,她可以上下左右通吃,和中国象棋里面的车(ju...

  • OC阶乘计算

    OC中的阶乘算法,原理就是递归。在OC中也可以用c语言来实现。

  • 矩阵链乘法

    递归算法: 迭代算法: 分析 递归算法:规模为n的问题,有n个递归,每个递归又有相应矩阵个数个递归,故T(n)=T...

  • 算法(11):回溯法

    今天补一下回溯法,别的不说,n皇后问题必须列出来才行~ 目录:算法:附录算法(1):递归算法(2):链表算法(3)...

  • ios oc用递归实现冒泡算法

    排序思路: 1 子问题,一趟排序把最大的数排到末尾 2 外层循环控制排序次数,内层循环控制比较次数。外层循环排序次...

  • 数据结构与算法二:认识O(NlogN)的排序

    1、递归算法 用递归算法求数组 arr[] 中的最大值 N程序实现: 递归逻辑图解如下图所示: 2、归并排序 归并...

  • 递归实现 n!

    递归的特点: 自己调用自己 设定终止条件 优点:算法简单缺点:效率低下 用递归实现阶乘 n! 用 for 循环实现...

  • 常见算法

    OC整理递归和排序算法

  • 欧几里得算法

    非递归算法 默认输入 m>=n 递归算法

网友评论

      本文标题:LeetCode51 -- iOS使用OC写算法之递归实现N皇后

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