萌新求助,WA了两个点bzd怎么搞
  • 板块P2802 回家
  • 楼主Durancer
  • 当前回复1
  • 已保存回复1
  • 发布时间2020/8/28 15:35
  • 上次更新2023/11/5 14:06:59
查看原帖
萌新求助,WA了两个点bzd怎么搞
230804
Durancer楼主2020/8/28 15:35
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
int map[20][20],n,m,bj[20][20],begin_x,begin_y,end_x,end_y,dis[20][20],blood=6;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int ans=1000000;
void search(int x,int y)
{
	for(int i=0;i<=3;i++)
	{
		int ox=x+dx[i];
		int oy=y+dy[i];
		if(ox>=1&&ox<=n&&oy>=1&&oy<=m&&bj[ox][oy]==0)
		{
			if(blood==1)
			{
				return;
			}
			else 
			{
				if(map[ox][oy]==4)
				{
					blood=6;
					bj[ox][oy]=1;
					dis[ox][oy]=dis[x][y]+1;
					blood--;
					search(ox,oy);
					bj[ox][oy]=0;
					blood++;
				}
				else 
				{
					bj[ox][oy]=1;
					dis[ox][oy]=dis[x][y]+1;
					blood--;
					if(map[ox][oy]==3)
					{
						ans=min(ans,dis[ox][oy]);
					}
					else search(ox,oy);
					bj[ox][oy]=0;
					blood++;
				}
			}
		}
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>map[i][j];
			if(map[i][j]==0)
			{
				bj[i][j]=1;
			}
			if(map[i][j]==2)
			{
				begin_x=i;
				begin_y=j;
			}
			if(map[i][j]==3)
			{
				end_x=i;
				end_y=j;
			}
		}
	}
	bj[begin_x][begin_y]=1;
	dis[begin_x][begin_y]=0;
	search(begin_x,begin_y);
	if(dis[end_x][end_y]!=0)
	{
		cout<<ans;
		return 0;
	}
	cout<<-1;
}
2020/8/28 15:35
加载中...