藍橋-穿越雷區

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章