同一个世界(三生梦醒)

前段时间写了同一个世界的,链接如下

同一个世界(erlang解题答案)

这次带来了三生梦醒的解题答案和思路,

首先看题目

还是用1代表黑色,0代表白色,用2代表黄点,x代表空白

抽象就是这样

----------------
| 1 | 1 | 1 | 1 |
----------------
| 1 | 0 | 0 | 1 |
----------------
| 0 | 1 | 1 | 1 |
----------------
| 1 | 0 | 0 | 0 |
----------------
| 1 | 1 | 1 | 1 |
----------------

这次因为每个点走的步数定了,所以暴力的使用轮询来解

把起点能走的所有路径找出来,(注意:这次的路径可以重复~~)

-module(oneword_three).

%..........省略

start(Data, {S, Scnt}, {E, Ecnt}) ->
    Pid = self(),
    Load_data = [{Num, List} || {Num, _V, List} <- Data],
    Val_data = [{Num1, V1} || {Num1, V1, _List1} <- Data, V1 =/= []],
    Tab1 = ets:new(?TAB, [public, duplicate_bag, {write_concurrency, true}]),
    Tab2 = ets:new(?TAB, [public, duplicate_bag, {write_concurrency, true}]),
    spawn(fun() -> start_try(Pid, Load_data, Tab1, S, Scnt) end),        %并发去尝试所有的路径
    spawn(fun() -> start_try(Pid, Load_data, Tab2, E, Ecnt) end),
    do_loop(Val_data, Tab1, Tab2, 2).

%..........省略

start_try2(Pid, _Load_data, Tab, Loads, Nownum, 0) ->
    ets:insert(Tab, {?SIGNAL, [Nownum|Loads]}),      %走完了就把路径存表里面
    Pid ! stop;

start_try2(Pid, Load_data, Tab, Loads, Nownum, Scnt) ->
%    ets:insert(Tab, {?SIGNAL, [Nownum|Loads]}),
    {Nownum, List} = lists:keyfind(Nownum, 1, Load_data),
    Pids = [spawn(fun() -> start_try2(Pid, Load_data, Tab, [Nownum|Loads], X, Scnt-1) end) || X <- List],
    Pid ! {start, erlang:length(Pids)},
    Pid ! stop.

然后就是取表里面的路径轮询,

%..........省略


start(Val_data, Tab1, Tab2) -> Pid = self(), Yellow_num = [Num || {Num, V} <- Val_data, V == 2], Slist = [ Z || {_N, Z} <- ets:tab2list(Tab1)], Elist = [ Z1 || {_N1, Z1} <- ets:tab2list(Tab2)], % io:format("here is Slist:~p, Elist:~p~n", [Slist, Elist]), _P = [spawn_link(fun() -> check(Pid, Yellow_num, Val_data, X, Y) end)|| X <- Slist, Y <- Elist],    %轮询去所有的数据 wait_loop(). wait_loop() -> receive Any -> io:format("this is a erorr msg:~p~n", [Any]) end, wait_loop(). check(Pid, Yellow_num, Val_data, X, Y) -> X1 = lists:reverse(X), Y1 = lists:reverse(Y), L = X1 ++ Y1, case check_all(Yellow_num, L) of            %首先要求所有的黄点都走到 ok -> case check_ok(Val_data, X1, Y1) of      %check结果是否是全1或者全0 ok -> ?SERVERNAME ! {ok, Pid, X1, Y1}; no -> no end; no -> no end.
%..........省略

然后就出结果了

13> oneword:start(A,{12,5},{13,5}).               
<0.6761.106>
 ----------------
| 1 | 1 | 1 | 1 |
 ----------------
| 1 | 0 | 0 | 1 |
 ----------------
| 0 | 1 | 1 | 1 |
 ----------------
| 1 | 0 | 0 | 0 |
 ----------------
| 1 | 1 | 1 | 1 |
 ----------------
the answere is:
 line1:[12,11,10,6,7,11]
 line2:[13,9,10,14,15,16]

tips:

如果有3个起点,可以先随便走一个,猜其他的2个,如下

走一下下面步骤3的,变成这样

然后再解答

16> oneword:start(A,{5,5},{8,5}).  
<0.11334.106>
 ----------------
| X | 1 | 1 | X |
 ----------------
| 1 | 0 | 0 | 1 |
 ----------------
| 1 | 0 | 0 | 1 |
 ----------------
| 1 | 1 | 1 | 1 |
 ----------------
| X | 0 | 0 | X |
 ----------------
the answere is:
 line1:[5,6,10,14,18,14]
 line2:[8,7,11,15,19,15]

答案就出来了

原文地址:https://www.cnblogs.com/tudou008/p/5545229.html