X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?
已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
例如:
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
坦克车只能水平或垂直方向上移动到相邻的区。
数据格式要求:
输入第一行是一个整数n,表示方阵的大小, 4<=n<100
接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
A,B都只出现一次。
要求输出一个整数,表示坦克从A区到B区的最少移动步数。
如果没有方案,则输出-1
例如:
某坦克需要从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<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; }