蓝桥-穿越雷区

X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。 
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?


已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。 
例如: 
A + - + - 
- + - - + 
- + + + - 
+ - + - + 
B + - + -


坦克车只能水平或垂直方向上移动到相邻的区。


数据格式要求:


输入第一行是一个整数n,表示方阵的大小, 4<=n<100 
接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。 
A,B都只出现一次。


要求输出一个整数,表示坦克从A区到B区的最少移动步数。 
如果没有方案,则输出-1


例如: 

用户输入: 


A + - + - 
- + - - + 
- + + + - 
+ - + - + 
B + - + -

则程序应该输出: 
10

#include<iostream>
#include<algorithm>
using namespace std;
char mp[105][105];
int vis[105][105];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int mn=10000,n;
int l[50][2];
int judge=0;
void dfs(int x,int y,int way,char last)
{
	if(mp[x][y]=='B' || way>mn)
	{
		judge=1;
		mn=min(way,mn);
		return;
	}
	for(int i=0;i<4;i++)
	{
		int xx=x+dx[i];
		int yy=y+dy[i];
		if(xx<0 || xx>=n || yy<0 || yy>=n || mp[xx][yy]==last)
		{
			continue;
		}
		if(vis[xx][yy]==0)
		{
			vis[xx][yy]=1;
			dfs(xx,yy,way+1,mp[xx][yy]);
			vis[xx][yy]=0;
			
		}
	}
}
int main()
{
	int sx,sy;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			cin>>mp[i][j];
			if(mp[i][j]=='A')
			{
				sx=i,sy=j;
			}
		}
	}
	vis[sx][sy]=1;
	dfs(sx,sy,0,'A');
	if(judge==1)
		cout<<mn<<endl;
	else
		cout<<judge<<endl;
	return 0;
}


猜你喜欢

转载自blog.csdn.net/wechat_huihui/article/details/80206399
今日推荐