DFS-地图

来源:互联网 发布:js获取表单提交的数据 编辑:程序博客网 时间:2024/06/06 04:39

穿越雷区

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 , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

#include<iostream>#include<cstring>using namespace std;char map[100][100];//地图数组int flag[100][100];//记录是否走过int next[4][2]={{0,-1},{0,1},{-1,0},{1,0}};//下一步走向int mmin=1<<30;//最小值int n;//方阵大小int check(int x, int y, int tx, int ty)//检查下一步是否符合要求{    if(tx<0||tx>=n||ty<0||ty>=n||map[x][y]==map[tx][ty])        return 0;    return 1;}void dfs(int x,int y,int step)//搜索{    int tx,ty;//下一步坐标    if(map[x][y]=='B')//结束条件    {        if(step<mmin)//更新最小值        {            mmin=step;            return;        }    }    for(int i=0; i<4; i++)    {        tx=x+next[i][0];        ty=y+next[i][1];        if(check(x, y, tx, ty)&&!flag[tx][ty])        {            flag[tx][ty]=1;            dfs(tx,ty,step+1);            flag[tx][ty]=0;        }    }}int main(){    int i,j;    int sx,sy;//起始位置    cin>>n;    getchar();    for(i=0; i<n; i++)    {        for(j=0; j<n; j++)        {            cin>>map[i][j];        }        if(map[i][j]=='A')//记录起始位置        {            sx=i;            sy=j;        }        getchar();    }    memset(flag,0,sizeof(flag));    dfs(sx,sy,0);    if(mmin==1<<30)        cout<<-1;//找不到路径    else        cout<<mmin;    return 0;}

输入:

5
A+-+-
-+–+
-+++-
+-+-+

输出:

10