版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37275680/article/details/82818056
今天上午做了昨晚的cf,下午做了北京的网络赛,并不会做。
ABD着重看了下,其中多个字符环的最长公共子串,最后也没有想出来怎么解决。
晚上就一直在看北京网络赛的第一题
我的代码,还没有完善,访问标记乱了……
#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