题目描述:
X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?
已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
例如:
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
例如:
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
坦克车只能水平或垂直方向上移动到相邻的区。
输入:
输入第一行是一个整数n,表示方阵的大小, 4<=n<100
接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
A,B都只出现一次。
输出:
要求输出一个整数,表示坦克从A区到B区的最少移动步数。
如果没有方案,则输出-1
#include<stdio.h>
#include<string.h>
#define INF 1<<30
char map[105][105];
int visited[105][105];
int dir[4][2]={-1,0,0,1,1,0,0,-1};//表示上右下左移动的方位
int min=INF;
int n,x2,y2;
void dfs(int x,int y ,int t ,char ch){
if(x<=0 || x>n || y<=0 || y>n) return ;//抛去 x=0
if(x==x2&&y==y2){//找到结束
if(t<min){
min=t;//看路径是否最小
return ;
}
}
for(int k=0;k<4;k++){
int dx=x+dir[k][0],dy=y+dir[k][1];//下一个节点
if(!visited[dx][dy]&&map[dx][dy]!=ch){//判断有没有访问过,是否与上一个不同
visited[dx][dy]=1;//标记访问过
dfs(dx,dy,t+1,map[dx][dy]);
visited[dx][dy]=0;//解除
}
}
}
int main(){
int i,j;
//memset(map,0,sizeof(map));
//memset(visited,0,sizeof(visited));
int x1,y1;//A 点
scanf("%d",&n);
for(i=1;i<=n;i++){//输入地图 i=1 四边留出空位来
for(j=1;j<=n;j++){
scanf("%*c%c",map[i]+j);
if(map[i][j]=='A'){//开始点
x1=i;
y1=j;
}
else if(map[i][j]=='B'){//终止点
x2=i;
y2=j;
}
}
}
visited[x1][y1]=1;//标记访问过
dfs(x1,y1,0,map[x1][y1]);
if(min==INF){
printf("-1");
}else{
printf("%d\n",min);
}
return 0;
}
不知道为什么这段代码超时间了下面是别人写的就没有超时间
总结:把二维数组的四周空出来,不作为地图,但是作为判断
#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;
}