POJ2312坦克大战(优先队列bfs)

简单的BFS搜索题,之前直接用的队列wa了一发,仔细想想还是需要用优先队列的。 因为在打坏砖块之后,当前节点的step++了, 因为在代码中打坏砖块然后移动到砖块上,这两个操作我们给合并到了一起,并不属于同一层节点,因此BFS的最短路性质就被破坏了,因此用优先队列,始终让头结点是step最小的那个就行了。有点像QUT校赛的那一题。

【代码】

#include
#include
#include
#include
#include
#define M 30
using namespace std;
char s[310][310];
bool vis[310][310];
struct node{
    int x,y;
    int step;
    node(int x = 0,int y =0 ,int step= 0):x(x),y(y),step(step){};
    bool operator < (const node &a)const{
        return step > a.step;
    }
}st,ed;
int dx[4] = {0,0,-1,1};
int dy[4] = {1,-1,0,0};int n,m;
int bfs(){
    priority_queueQ;
    Q.push(st);
    memset(vis,0,sizeof(vis));
    while(!Q.empty()){
        node now = Q.top(); Q.pop();
        node nt;
        for(int i=0;i<4;i++){
             nt.x = now.x + dx[i];
             nt.y = now.y + dy[i];
            nt.step = now.step + 1;
            if(nt.x >=0 && nt.x < n && nt.y>=0 && nt.y


你可能感兴趣的:(搜索)