rust N-Queens Algorithm

本文介绍了一种使用Rust编程语言实现N皇后问题的解决方案。通过递归和深度优先搜索,该算法能够找到所有可能的放置皇后的方式,使得皇后们在棋盘上互不攻击。代码中详细展示了如何检查皇后的冲突状态,并提供了输出结果和设置不同目标大小的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

N皇后 rust-algorithm

use std::rc::Rc;
use std::cell::RefCell;
struct Queens {
    target:i32,
    results:Rc<RefCell<Vec<Vec<i32>>>>,
}
impl Queens {
    pub fn new() -> Queens {
        let queen = Queens {
            target:8i32,
            results:Rc::new(RefCell::new(vec![])),
        };
        queen.find_result(vec![]);
        return queen;     
    }
    fn find_result(&self,result:Vec<i32>) -> bool {
        if result.len() == self.target as usize {
            self.results.borrow_mut().push(result);
            return true;
        }
        let current_row = result.len();
        for i in 0 .. self.target {
            if self.is_valid(current_row as i32,i,&result) {
                let mut new_result = result.clone();
                new_result.push(i);
                self.find_result(new_result);
            }
        }
        return false;
    }
    fn is_valid(&self,r:i32,c:i32,result:&Vec<i32>) -> bool {
        for (index,&value) in result.iter().enumerate() {
            if r == index as i32 || c == value || (c - value).abs() == (r - index as i32).abs() {
                return false;
            }
        }
        return true;
    }
    fn output_results(&self) {
        for result in &(*self.results.borrow()) {
            let mut line = result.iter().fold(String::from("["),|mut acc,elem| -> String {
                acc = format!("{}{} ",acc,elem);
                return acc;
            });
            line.pop();
            line.push(']');
            println!("{}",line);
        }
    }
    pub fn set_target(&mut self,t:i32) {
        self.target = t;
        self.find_result(vec![]);
    }
    pub fn results_len(&self) -> usize {
        return self.results.borrow().len();
    }
}
fn main() {
    let mut queen = Queens::new();
    queen.results_len();
    queen.output_results();
    queen.set_target(12);
    queen.output_results();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值