題意:如題所說。
注意:1.要考慮人是否能走到推箱子的地方
2.箱子經過的格仔可以再次經過,而箱子經過同乙個格仔從同乙個方向來的只能有一次
3.人不能穿過箱子
解法:bfs+bfs
ac**:
//bfs+bfs
#include#include
using
namespace
std;
#define mem(x,y) memset(x,y,sizeof(x));//
牛b的陣列初始化,網上學的
const
int m=25
;int useb[m][m][4],used[m][m];//
用作標記useb之所以是三維陣列是因為不單單要標記這一點而是要標記在這點上的方向
int map[m][m];//
地圖int n,m;//
輸入地圖的行和列
int bx,by,gx,gy,px,py;//
bx,by箱子的座標 gx,gy目的地的座標 px,py人的座標
int nn[4][2]=,,,};//
方向向量:左,上,右,下
int foat;//
深蒐時用作判斷是否能找到該點
struct node//
節點
const
bool
operator
主要作用是用於佇列中的元素按step的公升序排列
};bool outside(int x,int y)//
判斷是否出界
//void dfs(int sx,int sy,int ex,int ey)
//悲劇用深搜超時了
////
for(int i=0;i<4;i++)
////}//
}int dfs ( int sx, int sy, int ex, int ey ) //
搜尋人能否從一點移動到另一點}}
return0;
}int
bfs()
map[temp.bx][temp.by]=0;//
能到達還原標記
if(bx==gx&&by==gy)//
找到return temp.step+1
; q.push(node(bx,by,temp.bx,temp.by,temp.step+1
)); useb[bx][by][i]=1
; }
}return -1;}
intmain()}}
cout
}return0;
}/*5 60 0 0 0 0 3
1 0 1 4 0 1
0 0 1 0 0 1
1 0 2 0 0 1
0 0 0 0 0 1
5 50 3 0 0 0
1 0 1 4 0
0 0 1 0 0
1 0 2 0 0
0 0 0 0 0
*/
hdu 1254 推箱子遊戲
這個題目我就不說,鏈結在這裡 主要我想說的是,一開始是我用2個三圍陣列來分別標記人和箱子走過的四個方向,但不知怎麼回事行不通。於是就用乙個四維陣列來標記狀態,嘻嘻,過了。好吧,還是直接上 了。1 include2 include3 include4 5using namespace std 6int...
HDU 1254 推箱子(搜尋)
by cxlove 以前就做過的一題,重溫一下 推箱子遊戲,首先廣搜箱子的路徑,每一次移動都要判斷人是否能到達指定位置 bfs,dfs都行 我採用兩次bfs解決問題 在箱子的移動中,判重的時候需要乙個三維陣列,箱子從不同方向過來,人的位置是不一樣的,也就意味著狀態不一樣 id cxlove incl...
hdu 1254 推箱子遊戲
這個題目我就不說,鏈結在這裡 主要我想說的是,一開始是我用2個三圍陣列來分別標記人和箱子走過的四個方向,但不知怎麼回事行不通。於是就用乙個四維陣列來標記狀態,嘻嘻,過了。好吧,還是直接上 了。1 include2 include3 include4 5using namespace std 6int...