/*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;
}
dfs.坦克战车
最新推荐文章于 2024-10-17 12:58:51 发布