您的位置:首页 > 编程语言 > C语言/C++

穿越雷区第六届蓝桥杯大赛个人赛决赛(C语言A组)第四题

2016-05-24 13:56 573 查看
标题:穿越雷区

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

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

分析:DFS题目,判断的时候只需要判断要走的点的字符与上一点的字符是否相同即可。

代码如下:

#include <stdio.h>
#include <string.h>
#define INF 1<<30
char map[105][105];
int dir[4][2]={-1,0,0,1,1,0,0,-1};
int n;
int vis[105][105];
int min=INF;
int f_x,f_y;
void dfs(int x,int y,int t,char ch)
{
if(x<=0 || x>n || y<=0 || y>n)
return ;
if(x==f_x && y==f_y)
{
if(t<min)
min=t;
return ;
}
for(int k=0;k<4;k++)
{
int px=x+dir[k][0],py=y+dir[k][1];
if(!vis[px][py] && map[px][py]!=ch)
{
vis[px][py]=1;
dfs(px,py,t+1,map[px][py]);
vis[px][py]=0;
}
}
}

int main()
{
int i,j;
int s_x,s_y;
memset(map,0,sizeof(map));
memset(vis,0,sizeof(vis));
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%*c%c",map[i]+j);
if(map[i][j]=='A')
{//开始点
s_x=i;
s_y=j;
}
else if(map[i][j]=='B')
{//终止点
f_x=i;
f_y=j;
}
}
}
vis[s_x][s_y]=1;
dfs(s_x,s_y,0,map[s_x][s_y]);
if(min==INF)
printf("-1");
else
printf("%d\n",min);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: