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 资源约定: 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 资源约定: 峰值内存消耗 < 512M CPU消耗 < 1000ms 请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意: main函数需要返回0 注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。 注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。 提交时,注意选择所期望的编译器类型。峰值内存消耗 < 512M CPU消耗 < 1000ms 请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意: main函数需要返回0 注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。 注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。 提交时,注意选择所期望的编译器类型。
思路:就是建图而已,然后求一个最短路而已
#include <bits/stdc++.h> using namespace std; #define ri register int #define M 1000005 template <class G > void read(G &x) { x=0;int f=0;char ch=getchar(); while(ch<'0'||ch>'9'){f|=ch=='-';ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(ch<<3)+(ch^48);ch=getchar();} x=f?-x:x; return ; } // 9:33 int n,m; vector <int> p[M]; char s[109][109]; int ss,t; int dis[M]; struct cmp{ bool operator ()(const int a,const int b)const { return dis[a]>dis[b]; } }; priority_queue <int,vector<int>,cmp> q; int vis[M]; void dfs() { memset(dis,0x3f,sizeof(dis)); dis[ss]=0; q.push(ss); while(!q.empty()) { while(!q.empty()&&vis[q.top()]) q.pop(); if(q.empty()) break; int a=q.top();q.pop();vis[a]=1; if(a==t) break; for(ri i=0;i<p[a].size();i++) { int b=p[a][i]; if(dis[b]>dis[a]+1) { dis[b]=dis[a]+1; q.push(b); } } } } int main(){ cin>>n; for(ri i=1;i<=n;i++) { for(ri j=1;j<=n;j++) { cin>>s[i][j]; if(s[i][j]=='A') ss=(i-1)*n+j; if(s[i][j]=='B') t=(i-1)*n+j; if(i>=2) { if(s[i-1][j]!=s[i][j]) { int a=(i-2)*n+j; int b=(i-1)*n+j; p[a].push_back(b); p[b].push_back(a); } } if(j>=2) { if(s[i][j-1]!=s[i][j]) { int a=(i-1)*n+j-1; int b=(i-1)*n+j; p[a].push_back(b); p[b].push_back(a); } } } } dfs(); if(dis[t]==dis[0]) printf("-1"); else printf("%d",dis[t]); return 0; }