当前位置: 代码迷 >> 综合 >> 2018年9月22日训练日记
  详细解决方案

2018年9月22日训练日记

热度:57   发布时间:2023-11-02 20:55:22.0

今天上午做了昨晚的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; //氧气瓶的个数,不能超过5int 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 + 状压)

  相关解决方案