8-puzzle has a solution in prolog using manhattan distance

后端 未结 2 699
臣服心动
臣服心动 2020-12-15 15:02

The 8-puzzle will be represented by a 3x3 list of lists positions where the empty box will be represented by the value 9, as shown below: [[9,1,3],[5,2,6],[4,7,8]]

P

2条回答
  •  萌比男神i
    2020-12-15 15:28

    This answer looks at the problem from a different point of view:

    • Single board configurations are represented using the compound structure board/9.
    • Configurations that are equal up to sliding a single piece are connected by relation m/2.

    So let's define m/2!

    m(board(' ',B,C,D,E,F,G,H,I), board(D, B ,C,' ',E,F,G,H,I)).
    m(board(' ',B,C,D,E,F,G,H,I), board(B,' ',C, D ,E,F,G,H,I)).
    

    enter image description here enter image description here
    enter image description here enter image description here


    m(board(A,' ',C,D,E,F,G,H,I), board(' ',A, C , D, E ,F,G,H,I)).
    m(board(A,' ',C,D,E,F,G,H,I), board( A ,C,' ', D, E ,F,G,H,I)).
    m(board(A,' ',C,D,E,F,G,H,I), board( A ,E, C , D,' ',F,G,H,I)).
    

    enter image description here enter image description here enter image description here
    enter image description here enter image description here enter image description here


    m(board(A,B,' ',D,E,F,G,H,I), board(A,' ',B,D,E, F ,G,H,I)).
    m(board(A,B,' ',D,E,F,G,H,I), board(A, B ,F,D,E,' ',G,H,I)).
    

    enter image description here enter image description here
    enter image description here enter image description here


    m(board(A,B,C,' ',E,F,G,H,I), board(' ',B,C,A, E ,F, G ,H,I)).
    m(board(A,B,C,' ',E,F,G,H,I), board( A ,B,C,E,' ',F, G ,H,I)).
    m(board(A,B,C,' ',E,F,G,H,I), board( A ,B,C,G, E ,F,' ',H,I)).
    

    enter image description here enter image description here enter image description here
    enter image description here enter image description here enter image description here


    m(board(A,B,C,D,' ',F,G,H,I), board(A, B ,C,' ',D, F ,G, H ,I)).
    m(board(A,B,C,D,' ',F,G,H,I), board(A,' ',C, D ,B, F ,G, H ,I)).
    m(board(A,B,C,D,' ',F,G,H,I), board(A, B ,C, D ,F,' ',G, H ,I)).
    m(board(A,B,C,D,' ',F,G,H,I), board(A, B ,C, D ,H, F ,G,' ',I)).
    

    enter image description here enter image description here enter image description here enter image description here
    enter image description here enter image description here enter image description here enter image description here


    m(board(A,B,C,D,E,' ',G,H,I), board(A,B,' ',D, E ,C,G,H, I )).
    m(board(A,B,C,D,E,' ',G,H,I), board(A,B, C ,D,' ',E,G,H, I )).
    m(board(A,B,C,D,E,' ',G,H,I), board(A,B, C ,D, E ,I,G,H,' ')).
    

    enter image description here enter image description here enter image description here
    enter image description here enter image description here enter image description here


    m(board(A,B,C,D,E,F,' ',H,I), board(A,B,C,' ',E,F,D, H ,I)).
    m(board(A,B,C,D,E,F,' ',H,I), board(A,B,C, D ,E,F,H,' ',I)).
    

    enter image description here enter image description here
    enter image description here enter image description here


    m(board(A,B,C,D,E,F,G,' ',I), board(A,B,C,D,' ',F, G ,E, I )).
    m(board(A,B,C,D,E,F,G,' ',I), board(A,B,C,D, E ,F,' ',G, I )).
    m(board(A,B,C,D,E,F,G,' ',I), board(A,B,C,D, E ,F,  G,I,' ')).
    

    enter image description here enter image description here enter image description here
    enter image description here enter image description here enter image description here


    m(board(A,B,C,D,E,F,G,H,' '), board(A,B,C,D,E,' ',G, H ,F)).
    m(board(A,B,C,D,E,F,G,H,' '), board(A,B,C,D,E, F ,G,' ',H)).
    

    enter image description here enter image description here
    enter image description here enter image description here


    Almost done! To connect the steps, we use the meta-predicate path/4 together with length/2 for performing iterative deepening.

    The following problem instances are from @CapelliC's answer:

    ?- length(Path,N), path(m,Path,/* from */ board(1,' ',3,5,2,6,4,7, 8 ),
                                   /*  to  */ board(1, 2 ,3,4,5,6,7,8,' ')).
    N =  6, Path = [board(1,' ',3,5,2,6,4,7,8), board(1,2,3,5,' ',6,4,7,8),
                    board(1,2,3,' ',5,6,4,7,8), board(1,2,3,4,5,6,' ',7,8),
                    board(1,2,3,4,5,6,7,' ',8), board(1,2,3,4,5,6,7,8,' ')] ? ;
    N = 12, Path = [board(1,' ',3,5,2,6,4,7,8), board(1,2,3,5,' ',6,4,7,8),
                    board(1,2,3,5,7,6,4,' ',8), board(1,2,3,5,7,6,' ',4,8),
                    board(1,2,3,' ',7,6,5,4,8), board(1,2,3,7,' ',6,5,4,8),
                    board(1,2,3,7,4,6,5,' ',8), board(1,2,3,7,4,6,' ',5,8),
                    board(1,2,3,' ',4,6,7,5,8), board(1,2,3,4,' ',6,7,5,8),
                    board(1,2,3,4,5,6,7,' ',8), board(1,2,3,4,5,6,7,8,' ')] ? ;
    ...
    
    ?- length(Path,N), path(m,Path,/* from */ board(8,7,4,6,' ',5,3,2, 1 ),
                                   /*  to  */ board(1,2,3,4, 5 ,6,7,8,' ')).
    N = 27, Path = [board(8,7,4,6,' ',5,3,2,1), board(8,7,4,6,5,' ',3,2,1),
                    board(8,7,4,6,5,1,3,2,' '), board(8,7,4,6,5,1,3,' ',2),
                    board(8,7,4,6,5,1,' ',3,2), board(8,7,4,' ',5,1,6,3,2),
                    board(' ',7,4,8,5,1,6,3,2), board(7,' ',4,8,5,1,6,3,2),
                    board(7,4,' ',8,5,1,6,3,2), board(7,4,1,8,5,' ',6,3,2),
                    board(7,4,1,8,5,2,6,3,' '), board(7,4,1,8,5,2,6,' ',3),
                    board(7,4,1,8,5,2,' ',6,3), board(7,4,1,' ',5,2,8,6,3),
                    board(' ',4,1,7,5,2,8,6,3), board(4,' ',1,7,5,2,8,6,3),
                    board(4,1,' ',7,5,2,8,6,3), board(4,1,2,7,5,' ',8,6,3),
                    board(4,1,2,7,5,3,8,6,' '), board(4,1,2,7,5,3,8,' ',6),
                    board(4,1,2,7,5,3,' ',8,6), board(4,1,2,' ',5,3,7,8,6),
                    board(' ',1,2,4,5,3,7,8,6), board(1,' ',2,4,5,3,7,8,6),
                    board(1,2,' ',4,5,3,7,8,6), board(1,2,3,4,5,' ',7,8,6),
                    board(1,2,3,4,5,6,7,8,' ')] ? ;
    N = 29, Path = [...] ? ;
    ...
    

提交回复
热议问题