题目描述
已知的地图是一个方阵,上面用字母标出了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>, 不能通过工程
这个问题是个走迷宫求最短步数问题,我们很容易能想到通过bfs来进行。
我在做题的时候遇到的阻碍,不是算法之类的。反而是最基础的c和c++语言方面的问题。
如何将地图的信息作为一个二维数组进行储存。我当时想的是地图里面含有空格,储存的过程肯定要有消去空格这一步。用了scanf(“%c”);结果,很显然地图储存失败。原因是既忘了这个函数本身就可以忽略空格。又忘了消去换行符。最后,我使用了scanf(“ %c”);这种类型。
当然,为什么不用cin 直接存储。它既能够消去空格,又能够消去换行符等tab之类的键。不更好吗?
这个是因为 cin的存储效率是要小于scanf的,这是一个程序问题,要考虑到时间。为了保险起见我没有使用这个函数。当然如果是填空的话,我还是非常推荐使用这个函数的。能够很大程度上减少你的代码量。
代码如下:(通过了oj
#include <iostream>
#include <queue>
using namespace std;
struct point {
int x;
int y;
int step;
};
char map[100][100];
int color[100][100]={0}; // 标记地图是否走过。
int n;
int main(){
void bfs(point s);
point s;
cin >> n;
for(int j=0;j<n;j++){
for(int i=0;i<n;i++){
scanf(" %c",&map[j][i]);
if(map[j][i]=='A'){
s.x=j;
s.y=i;
s.step=0;
}
}
}
bfs(s);
return 0;
}
void bfs(point s){
queue<point> a;
a.push(s);
color[s.x][s.y]=1;
while(!a.empty()){
point now=a.front();
a.pop();
if(map[now.x][now.y]=='B'){
cout << now.step;
return ;
}
point next[4];
for(int i=0;i<4;i++){
if(i==0){
next[i].x=now.x+1;
next[i].y=now.y;
}
else if(i==1){
next[i].x=now.x-1;
next[i].y=now.y;
}
else if(i==2){
next[i].x=now.x;
next[i].y=now.y+1;
}
else if(i==3){
next[i].x=now.x;
next[i].y=now.y-1;
}
next[i].step=now.step+1;
}
for(int i=0;i<4;i++){
if(next[i].x>=0&&next[i].x<n &&next[i].y>=0&&next[i].y<n && map[now.x][now.y]!=map[next[i].x][next[i].y] && !color[next[i].x][next[i].y]){
color[next[i].x][next[i].y]=1;
a.push(next[i]);
}
}
}
cout << -1 ;
return;
}
)