2018年9月22日训练日记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37275680/article/details/82818056

今天上午做了昨晚的cf,下午做了北京的网络赛,并不会做。

ABD着重看了下,其中多个字符环的最长公共子串,最后也没有想出来怎么解决。

晚上就一直在看北京网络赛的第一题

ACM/ICPC 2018亚洲区预选赛北京赛站网络赛

我的代码,还没有完善,访问标记乱了……

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=110;
char mp[maxn][maxn];
int n,m;
int x1,y1; //唐僧的位置

struct Node{ //孙悟空在每个节点的状态
    int x,y;
    int num1; //氧气瓶的个数,不能超过5
    int num2; //加速平的个数,不限量
    int t; //耗时
};

int dir[4][2]={1,0,-1,0,0,1,0,-1},vis[maxn][maxn];  //下,上,右,左

int BFS(Node tp){
    memset(vis,0,sizeof(vis));
    queue<Node> q;
    q.push(tp);
    //vis[tp.x][tp.y]=1;
    Node tmp,nxt;

    while(!q.empty()){
        tmp=q.front();
        q.pop();

        for(int i=0;i<4;i++){
            nxt.x=tmp.x+dir[i][0];
            nxt.y=tmp.y+dir[i][1];
            if(nxt.x<0||nxt.x>=n||nxt.y<0||nxt.y>=m) continue;
            if(!vis[nxt.x][nxt.y]){
                if(mp[nxt.x][nxt.y]=='T'){
                    if(tmp.num2!=0)
                        return tmp.t;
                    else return tmp.t+1;
                }
                else if(mp[nxt.x][nxt.y]=='.'){
                    if(tmp.num2!=0){
                        nxt.t=tmp.t;
                        nxt.num2=tmp.num2-1;
                    }else{
                        nxt.t=tmp.t+1;
                        nxt.num2=tmp.num2;
                    }
                    nxt.num1=tmp.num1;
                    q.push(nxt);
                    //vis[nxt.x][nxt.y]=1;
                }else if(mp[nxt.x][nxt.y]=='#'&&tmp.num1!=0){
                    if(tmp.num2!=0){
                        if(tmp.num2>1){
                            nxt.t=tmp.t;
                            nxt.num2=tmp.num2-2;
                        }else{
                            nxt.t=tmp.t+1;
                            nxt.num2=tmp.num2-1;
                        }
                    }else{
                        nxt.t=tmp.t+2;
                        nxt.num2=tmp.num2;
                    }
                    nxt.num1--;
                    q.push(nxt);
                   // vis[nxt.x][nxt.y]=1;
                }else if(mp[nxt.x][nxt.y]=='B'){
                    if(tmp.num2!=0){
                        nxt.t=tmp.t;
                        nxt.num2=tmp.num2-1;
                    }else{
                        nxt.t=tmp.t+1;
                        nxt.num2=tmp.num2;
                    }
                    nxt.num1++;
                    q.push(nxt);
                    //vis[nxt.x][nxt.y]=1;
                }
            }
        }
    }
    return -1;

}



int main(){
    while(~scanf("%d%d",&n,&m)){
        if(n==0&&m==0) break;
        for(int i=0;i<n;i++){
            scanf("%s",mp[i]);
        }

        Node tmp;
        bool flag=false;
        for(int i=0;i<n;i++){
            if(flag) break;
            for(int j=0;j<m;j++){
                if(mp[i][j]=='S'){
                    tmp.x=i;
                    tmp.y=j;
                    tmp.num1=0;
                    tmp.num2=0;
                    tmp.t=0;
                    flag=true;
                    break;
                }
            }
        }
        int ans=BFS(tmp);
        printf("%d\n",ans);
    }

    return 0;
}

往年相似的一题。hdu5025 Saving Tang Monk

题解:HDU 5025:Saving Tang Monk(BFS + 状压)

猜你喜欢

转载自blog.csdn.net/qq_37275680/article/details/82818056