穿越雷区第六届蓝桥杯大赛个人赛决赛(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题目,判断的时候只需要判断要走的点的字符与上一点的字符是否相同即可。
代码如下:
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; }
相关文章推荐
- C语言字符串数组与字符串指针详解
- C,C++宏中#与##的讲解
- 在c++中用while(cin)的问题
- socket 简单聊天程序
- c++虚函数问题
- 指针的顶层和底层const对指针的引用的影响
- 跨平台的C++应用和UI开发库 QT
- 跨平台的C++应用和UI开发库 QT
- C++第六次上机实验--数组操作
- c#调用c++动态库的一些理解
- c++字符串表示
- Tromino谜题 ---- 分治法(C++版&OpenCV版)
- C++第六次上机实验—数组增减
- QString类
- C++实验6-字符串操作
- 黑马程序员再添高端学科,重磅推出C/C++课程
- windows 系统 C语言写PHP简单扩展
- C++ 类的声明
- C++第六次作业
- C语言常用程序(1):计算某日是该年的第几天