学习总结!

最近主要学习了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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值