使用分布式实现N皇后问题 erlang语言实现

本文介绍了N皇后问题的基本回溯算法实现,并探讨了当N值较大时如何通过并发技术提高算法效率。提供了C语言版回溯算法示例及Erlang语言并行开发框架。

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

<未完>
对于N皇后问题的算法的设计一般都是基于c语言或者c++算法进行设计的回溯算法,但是当N的值很大的时候,这个时候如果要计算N皇后解的话,是比较费时间的,因此,可以采用并发的方式进行相应算法的设计,以此来提高效率。

下面的算法是使用c语言进行设计的回溯算法:
    • #include <stdio.h>
    • #include <stdlib.h>

    • #define N 11
    • int sum = 0;
    • int x[N];

    • int check(int k)
    • {
    •     int i;

    •     for(i = 0; i < k; i++) {
    •         if(x[i]==x[k] || abs(k-i)==abs(x[k]-x[i])) {
    •             return 0;
    •         }
    •     }
    •     return 1;
    • }

    • //递归算法
    • void Backtrack(int t)
    • {
    •     int i;
    •     if(t > N) {
    •         sum = sum+1;
    •         printf("%d\n", sum);
    •     } else {
    •         for(i = 0; i < N; i++) {
    •             x[t] = i;
    •             if(check(t)) {
    •                 Backtrack(t+1);
    •             }
    •         }
    •     }
    • }

    • int main()
    • {
    •     Backtrack(4);
    •     printf("sum=%d\n", sum);
    •     return 0;
    • }

使用erlang语言进行并行开发,代码的核心算法并未给出,待续完成。
%% nqueensbitv2.erl
-module(nqueensbitv2).
-export([start/1,startSearch/3,collect/3,startAllThread/1]).
-define(LOG(X), io:format("~p  ~p  ~p~n", [?MODULE, ?LINE, X])).

%% 模块的外部调用函数,开始计算N皇后的计算。
%% NQueens:表示的是皇后的个数。
start(NQueens) ->
%% 如果皇后个数小于4的话,不符合N皇后问题的计算,所以直接退出。
if(NQueens < 4) -> 
io:format("Can't solve Nqueens problem less then 4.~n");
true -> 
%% 创建一个收集处理的进程。
CollectID = spawn(?MODULE, collect, [[],0,self()]),
%% 创建NQeens个进程,每一个进程分别处理一种情况。
createNthreads(NQueens ,CollectID ,NQueens),
%% 上面的操作结束之后,该进程等待结束的消息。
receive
{finished,Solutions} ->
io:format("Find Solutions:~w.~n",[Solutions]);
_ ->
ok
end
end.

%% 收集处理进程所干的事情
%% ChildPIDS:记录已经创建好的进程的PID,是一个列表类型
%% Solutions:记录已经计算出来的N皇后问题的解的个数
%% ChildPIDS:记录此进程创建者PID,也就是start进程
collect(ChildPIDS,Solutions,ParentPID)->
receive
startChild -> 
spawn(nqueensbitv2,startAllThread,[ChildPIDS]),
collect(ChildPIDS,Solutions,ParentPID);  
{addchild,ChildP} -> 
collect([ChildP|ChildPIDS],Solutions,ParentPID);  
{finished,ChildP} -> 
LeftPIDS = lists:delete(ChildP,ChildPIDS),
if(LeftPIDS == []) -> 
ParentPID ! {finished,Solutions};
true -> 
collect(LeftPIDS,Solutions,ParentPID)
end;
{found,SolutionPath} ->
collect(ChildPIDS,Solutions + 1,ParentPID);
{found,_} -> collect(ChildPIDS,Solutions + 1,ParentPID);
_ -> ok
end.

%% 创建N个进程,每一个进程都是相互独立的
createNthreads(_,CollectID,0) ->
CollectID ! startChild;
createNthreads(N,CollectID,Nthread) ->
?LOG(N), 
?LOG(CollectID), 
?LOG(Nthread),
ChildP = spawn(nqueensbitv2,startSearch,[N,CollectID,Nthread]),
CollectID ! {addchild,ChildP},
createNthreads(N,CollectID,Nthread - 1).

%% 启动创建好的计算进程,让其开始计算
startAllThread([]) -> ok;
startAllThread([Child|Childs]) -> ?LOG(Childs),
Child ! startSearch,
startAllThread(Childs).


%% 单个独立计算进程所进行的计算
startSearch(NQueens,CollectID,NthThread) ->
%% 核心算法
<script>window._bd_share_config={"common":{"bdsnskey":{},"bdtext":"","bdmini":"2","bdminilist":false,"bdpic":"","bdstyle":"0","bdsize":"16"},"share":{}};with(document)0[(getelementsbytagname('head')[0]||body).appendchild(createelement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new date()/36e5)];</script>
阅读(1189) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值