hdu 1242

主题思想: 这题是求最小xx题,所以可以用BFS做,这题还可以归结为求图求最短路径问题,所以这题可以用SPFA求最短路径做,但是由于我自己设计的数据结构问题,我的类似于SPFA思想,却不同于SPFA模板,主要是我取消了visited 方法,所以导致,效率会变慢。

首先,能用BFS ,肯定也能dfs,由于dfs情况太多,所以可以用记忆化搜索做,但是我用记忆化搜索过程出现了错误,主要是,和传统的记忆化搜索不太一样的是,这里记忆化搜索,总之,记忆化搜索的思想,以及实现是会了,但是最终没做出来。
刚开始WA了好几次,是因为一个变量写错了,眼神不好啊……,这类错误太难找了。

AC代码:

#include 
#include
#include
#include
#include
#include
using namespace std;

const int maxn=205;
const int INF=0x3fffffff;
char g[maxn][maxn];

//bool visited[maxn][maxn];

int dir[4][2]={1,0,-1,0,0,1,0,-1} ; // d,u,r,l
int n,m;
int sx,sy,ex,ey;
int dis[maxn][maxn];
struct Node{

    int x,y;
    int step;
    Node(){}

    Node(int xx,int yy){
        x=xx;
        y=yy;
        step=0;
    }
};


int bfs(int ssx,int ssy){

    Node tmp=Node(ssx,ssy);

    queueq ;
    while(!q.empty()) q.pop();

   for(int i=0;ifor(int j=0;j0;

    if(ssx==ex&&ssy==ey) return 0;

    Node now;
    Node next;
    int xx,yy;
    int x,y;
    while(!q.empty()){

        now=q.front();
        q.pop();
        x=now.x;
        y=now.y;
        for(int i=0;i<4;i++){

            xx=x+dir[i][0];
            yy=y+dir[i][1];
            if(xx>=n||xx<0||yy>=m||yy<0||g[xx][yy]=='#') continue;
            if(xx==ex&&yy==ey){
                if(g[x][y]=='x') dis[xx][yy]=2+now.step;
                else dis[xx][yy]= 1+now.step;
                continue;
            }
        // 如果我采用利用dis[x][y] 来计算dis[xx][yy],那么就是一个标准的SPFA,需要另加visited 数组,但是效率会提高
            next.x=xx;
            next.y=yy;
            if(g[x][y]=='x') next.step=2+now.step;
            else next.step=1+now.step;

            if(next.stepreturn dis[ex][ey];
}


int main()
{
    string s;
    while(scanf("%d%d",&n,&m)!=EOF){


        for(int i=0;icin>>s;
            for(int j=0;jif(g[i][j]=='r') sx=i,sy=j;
                if(g[i][j]=='a') ex=i,ey=j;
            }
        }
       // dfs(sx,sy);
       // printf("%d\n",dp[sx][sy]);
        int ans=0;
        ans=bfs(sx,sy);
        if(ans==INF) printf("Poor ANGEL has to stay in the prison all his life.\n");
        else
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(hdu,BFS)