HDU 1026

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1026


BFS+递归..状态构造不难。 用一个结构体,记录能到当前点的最短步数,方向。。等等。


下面是AC代码:


#include<iostream>
#include<queue>
using namespace std;
int n,m,flag;
char map[110][110];
bool visited[110][110];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
struct node{
    int x,y,step;
    int pre_dir;
}s_pos,count_map[110][110];
void print_path(int pre_dir,int x,int y,int step){
    int pre_x=x-dir[pre_dir][0],pre_y=y-dir[pre_dir][1];

    if(x==0&&y==0)  return ;
    else{ 
        
        if(map[x][y]=='.'){
               print_path(count_map[pre_x][pre_y].pre_dir,pre_x,pre_y,step-1);  
              printf("%ds:(%d,%d)->(%d,%d)\n",step,pre_x,pre_y,x,y);
        }
        else{
            print_path(count_map[pre_x][pre_y].pre_dir,pre_x,pre_y,step-(map[x][y]-'0')-1);
            printf("%ds:(%d,%d)->(%d,%d)\n",step-(map[x][y]-'0'),pre_x,pre_y,x,y);
            for(int i=map[x][y]-'0'-1;i>=0;i--){          
                  printf("%ds:FIGHT AT (%d,%d)\n",step-i,x,y);

            }

        }
    }
}

bool cheak(int x,int y){
    if(x>=0&&x<n&&y>=0&&y<m&&map[x][y]!='X')
        return true;
    return false;
}
void bfs(){
    s_pos.x=0,s_pos.y=0,s_pos.step=0;
    s_pos.pre_dir = -1;

    visited[s_pos.x][s_pos.y]=true;
    queue<node > q;

    q.push(s_pos);

    while(!q.empty()){
        node now=q.front();   q.pop();
        if(now.x==n-1&&now.y==m-1){
            flag=1;
        }

        for(int i=0;i<4;i++){
            node next=now;
            next.x+=dir[i][0],next.y+=dir[i][1];  

            if(cheak(next.x,next.y)){
                if(map[next.x][next.y]=='.'){
                    next.step+=1;

                    if(next.step<count_map[next.x][next.y].step){
                           count_map[next.x][next.y].step=next.step;
                        count_map[next.x][next.y].pre_dir=i;
                         q.push(next);
                    }
                }
                else if(map[next.x][next.y]>='1'&&map[next.x][next.y]<='9'){

                    next.step+=map[next.x][next.y]-'0'+1;

                    if(next.step<count_map[next.x][next.y].step){
                        count_map[next.x][next.y].step=next.step;
                        count_map[next.x][next.y].pre_dir=i;
                        q.push(next);
                    }


                }

            }


        }


    }


}
int main(){

    int i,j;
    while(cin>>n>>m){
        for(i=0;i<n;i++)   cin>>map[i];
        memset(visited,false,sizeof(visited));
        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
                count_map[i][j].step=10000000;
            flag=0;
        bfs();
        if(!flag){
            printf("God please help our poor hero.\n");
            printf("FINISH\n");
        }
        else{
            printf("It takes %d seconds to reach the target position, let me show you the way.\n",count_map[n-1][m-1].step);
            print_path(count_map[n-1][m-1].pre_dir,n-1,m-1,count_map[n-1][m-1].step);
            printf("FINISH\n");
            
        }

    }
    return 0;

}


你可能感兴趣的:(struct,ini,Path)