dfs.坦克战车

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

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

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

输入
输入第一行是一个整数n,表示方阵的大小, 4<=n<100
接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
A,B都只出现一次。
输出
要求输出一个整数,表示坦克从A区到B区的最少移动步数。
如果没有方案,则输出-1

样例输入
5
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
样例输出
10*/
#include<bits/stdc++.h>
#define maxn 0x3f3f3f3f
using namespace std;
int n;
char mp[100][100];
int Min=maxn;//记录最短路径 
int A_x,A_y,B_x,B_y;//记录A,B的位置 
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//方向
int vis[100][100]; 
void dfs(int x,int y,int step)
{
	if(mp[x][y]=='B')//A->B  目的状态 
	{
		if(step<Min)  //目的操作 
		{
			Min=step;
		}
		return ;
	}
	for(int i=0;i<4;i++) //搜索方式 
    {
        int nx=x+dir[i][0];//操作 
        int ny=y+dir[i][1];
        if(mp[x][y]!=mp[nx][ny]&&nx>=0&&ny>=0&&nx<n&&ny<n&&!vis[nx][ny]) //合法状态 
        {
        	vis[nx][ny]=1;                //标记 
            dfs(nx,ny,step+1);          //更新状态参数 
            vis[nx][ny]=0;                //还原标记 
        }
    }
	
	
}
int main()
{
	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')
		{
			A_x=i;
			A_y=j;
		}
		
	}
	//A到B
	dfs(A_x,A_y,0); 
	if(Min!=maxn)
	{
		cout<<Min;
	
	}
	else
	cout<<-1;
	return 0;
} 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值