搜索-坦克战车

题目描述:
X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
某坦克需要从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;  
    }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值