被这道题坑到了,如果单纯的模拟题目所给的步骤,就会出现同一个位置要走两次的情况。。。所以对于bfs来说会很头痛。

第一个代码是wa掉的代码,经过调试才知道这个wa的有点惨,因为前面的操作有可能会阻止后面的正确操作:

#include"iostream"
#include"stdio.h"
#include"algorithm"
#include"cmath"
#include"string.h"
#include"queue"
#define mx 100
using namespace std;
char castle[mx][mx];
int n,m,t,p,sx,sy,ex,ey;
struct node
{
    int x,y;
    int magic;
    int times;
    char flag;//用来标记当前位置是@还是.
    friend bool operator<(node a,node b)
    {
        if(b.times!=a.times) return b.times<a.times;
        return a.magic<b.magic;
    }
};
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
bool judge(int x,int y)
{
    if(x>=0&&x<n&&y>=0&&y<m&&castle[x][y]!='#') return true;
    return false;
}
void bfs()
{
    node cur,next;
    int i;
    cur.x=sx;cur.y=sy;cur.times=0;cur.magic=p;cur.flag='.';
    priority_queue<node>q;
    q.push(cur);
    while(!q.empty())
    {
        cur=q.top();
        q.pop();
       // cout<<cur.x<<' '<<cur.y<<' '<<cur.magic<<' '<<cur.times<<' '<<cur.flag<<endl;
        if(cur.x==ex&&cur.y==ey&&cur.times<=t)
        {
            cout<<"Yes, Yifenfei will kill Lemon at "<<cur.times<<" sec."<<endl;
            return;
        }
         if(cur.times>t)
        {
            cout<<"Poor Yifenfei, he has to wait another ten thousand years."<<endl;
            return;
        }
      
        for(i=0;i<4;i++)
        {
            next.x=cur.x+dir[i][0];
            next.y=cur.y+dir[i][1];
            if(judge(next.x,next.y))
            {
                if(cur.flag=='@'&&cur.magic>0)
                {
                    next.times=cur.times+1;
                    next.magic=cur.magic-1;
                    if(castle[next.x][next.y]=='@')next.flag='@';
                    else next.flag='.';
                    castle[next.x][next.y]='#';
                    q.push(next);
                }
                else if(cur.flag=='.')
                {
                    if(castle[next.x][next.y]=='@')
                    {
                        if(cur.magic>0)
                        {
                            next.times=cur.times+1;
                            next.magic=cur.magic-1;
                            next.flag='@';
                            castle[next.x][next.y]='#';
                            q.push(next);
                        }
                    }
                    else
                    {
                        next.times=cur.times+2;
                        next.magic=cur.magic;
                        next.flag='.';
                        castle[next.x][next.y]='#';
                        q.push(next);
                        if(cur.magic>0)
                        {
                            next.times=cur.times+1;
                            next.magic=cur.magic-1;
                            q.push(next);
                        }

                    }
                }
            }
        }
    }
    cout<<"Poor Yifenfei, he has to wait another ten thousand years."<<endl;
}
int main()
{
    int c=0;
    while(scanf("%d%d%d%d",&n,&m,&t,&p)==4)
    {
        int i,j;
        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
        {
            cin>>castle[i][j];
            if(castle[i][j]=='Y') {sx=i;sy=j;castle[i][j]='#';}
            else if(castle[i][j]=='L'){ex=i;ey=j;castle[i][j]='.';}
        }
        cout<<"Case "<<++c<<":"<<endl;
        bfs();
    }
    return 0;
}
View Code

相关文章: