最近主要学习了java,题目的话就写了两道。
这道题目运用三维的bfs,第一次做时无从下手,原来可以利用三维数组(第一次用三维数组)可以解决这类问题,然后套bfs模板即可。
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N=32;
char g[N][N][N];
int d[N][N][N];
int l,r,c,ans;
int dx[6]={0,0,1,-1,0,0};
int dy[6]={0,0,0,0,1,-1};
int dz[6]={1,-1,0,0,0,0};
int x1,y11,z1,x2,y2,z2;
struct w{
int x;
int y;
int z;
};
typedef w wh;
int bfs()
{
queue<wh>q;
memset(d,-1,sizeof(d));
q.push({x1,y11,z1});
d[x1][y11][z1]=0;
while(q.size())
{
wh t=q.front();
q.pop();
for(int k=0;k<6;++k)
{
int tx=t.x+dx[k];
int ty=t.y+dy[k];
int tz=t.z+dz[k];
if(tx>=0&&tx<l&&ty>=0&&ty<r&&tz>=0&&tz<c&&g[tx][ty][tz]=='.'&&d[tx][ty][tz]==-1)
{
q.push({tx,ty,tz});
d[tx][ty][tz]=d[t.x][t.y][t.z]+1;
}
}
}
return d[x2][y2][z2];
}
int main()
{
while(cin>>l>>r>>c&&(l||r||c))
{
for(int i=0;i<l;++i)
for(int j=0;j<r;++j)
for(int k=0;k<c;++k)
{
cin>>g[i][j][k];
if(g[i][j][k]=='S')
{
x1=i;
y11=j;
z1=k;
}
if(g[i][j][k]=='E')
{
x2=i;
y2=j;
z2=k;
g[i][j][k]='.';
}
}
ans=bfs();
if(ans==-1)
cout<<"Trapped!"<<endl;
else
cout<<"Escaped in"<<" "<<ans<<" "<<"minute(s)."<<endl;
}
return 0;
}
这道题目和洛谷上的一道题目非常像,几乎一摸一样,做题时不要忘记在循环里,每循环一次都要把答案归零,不然会不断累加。这道题主要考察联通块,这类问题主要是从一个目标点出发,经过之后就要更新,然后在不断往各个方向走。记录答案即可。
#include<iostream>
using namespace std;
const int N=105;
int m,n,ans;
char g[N][N];
int dx[8]={0,1,0,-1,1,1,-1,-1};
int dy[8]={1,0,-1,0,1,-1,1,-1};
void dfs(int x,int y)
{
g[x][y]='*';
for(int k=0;k<8;k++)
{
int tx=x+dx[k];
int ty=y+dy[k];
if(tx>=0&&tx<m&&ty>=0&&ty<n)
{
if(g[tx][ty]=='@')
{
dfs(tx,ty);
}
}
}
}
int main()
{
while(cin>>m>>n&&(m||n))
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>g[i][j];
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(g[i][j]=='@')
{
dfs(i,j);
ans++;
}
}
cout<<ans<<endl;
ans=0;
}
return 0;
}