1. 程式人生 > 其它 >[NOIP2013 提高組] 華容道

[NOIP2013 提高組] 華容道

這道題記錄狀態的思想挺好的

假如棋子在(i,j):

那麼它上面空格的編號為((i-1)*4+(j-1)*4+0)

那麼它下面空格的編號為((i-1)*4+(j-1)*4+1)

那麼它左面空格的編號為((i-1)*4+(j-1)*4+2)

那麼它右面空格的編號為((i-1)*4+(j-1)*4+3)


↑手動分割

所以俺們要記錄的

①在不動棋子本身的情況下,棋子周圍空格亂轉的最小步數(在可行情況下)

//虛擬碼
(x,y)棋子位置
for i from 0 to 3
    for j from i+1 to 3
        int step=bfs((x-1)*4+(y-1)*4+i,(x-1
)*4+(y-1)*4+j);    add((x-1)*4+(y-1)*4+i,(x-1)*4+(y-1)*4+j,step);    add((x-1)*4+(y-1)*4+j,(x-1)*4+(y-1)*4+i,step);

②移動棋子(分為左右移動與上下運動)(在可行情況下)

//虛擬碼
(x,y)棋子位置
add((x-1)*4+(y-1)*4+1,x*4+(y-1)*4+0,1);//上到下 
add((x-1)*4+(y-1)*4+0,(x-2)*4+(y-1)*4+1,1);//下到上
add((x-1)*4+(y-1)*4+3,(x-1)*4+y*4+2,1);//左到右 
add((x-1)*4+(y-1)*4+2,(x-1)*4+(y-2)*4+3,1);//右到左

求路徑步驟:將空格移到起始棋子的上下左右的步數+開始最短路+在結束棋子上下左右空格中尋找答案

END

沒打程式碼,嘿嘿(again)