小于哥的鱼干


私信TA

用户名:yuhui1207

访问量:18176

签 名:

在人间已是巅,何苦要上青天

等  级
排  名 414
经  验 5013
参赛次数 2
文章发表 32
年  龄 24
在职情况 在职
学  校 常熟理工
专  业

  自我简介:

TA的其他文章

解题思路:
            深度优先搜索
注意事项:

参考代码:

#include<stdio.h>
#include<string.h>

int flag;//作为是否能够到达目的点的标记
int n,m,startx,starty,endx,endy;//起始点与目的点的坐标
int map[15][15]; //存储图
int visit[15][15]; //记录点是否已经访问过

void dfs(int x,int y) //深度优先搜索
{
	int next[4][2]={{1,0},
					{-1,0},
					{0,1},
					{0,-1}};//定义的四个方向
    int i;
	int nextx,nexty;
    for(i=0;i<4;i++)//从当前点出发往四个方向去探寻
    {
        nextx=next[i][0]+x;
        nexty=next[i][1]+y;// 实现点的四个方向的移动
        if(nextx<0||nextx>n-1||nexty<0||nexty>m-1)// 如果移动时越界了则因不符条件而退出此次移动
        {
            continue;
        }
        if(visit[nextx][nexty]==0&&map[nextx][nexty]==1)// 若移动到的点是尚未访问过的且是可以去的点,那么再进行下一步点的深度优先搜索
        {
            visit[nextx][nexty]=1; //访问过后标记为1
            dfs(nextx,nexty);  //以新的点再次继续往深处搜索
        }
        if(nextx==endx&&nexty==endy)//如果到达了目的点,即可以宣布找到退出了
        {	
            flag=1;
            break;
        }
    }



}

int main()
{
	char c;
	int t;
	int i,j;
	scanf("%d",&t);
	while(t--)
	{
		flag=0;
		memset(visit,0,sizeof(map));
		scanf("%d%d",&n,&m);
		getchar();
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)				//绘制迷宫
			{
				scanf("%c",&c);
				if(c=='#')
					map[i][j]=0; 
                else if(c=='.')
					map[i][j]=1;
				else if(c=='S')
					map[i][j]=2;		
				else if(c=='T')
					map[i][j]=3;
					
			}
			getchar(); 
		}
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
			{
				if(map[i][j]==2)		//得到起点坐标
				{
					startx=i;
					starty=j;
				}
				if(map[i][j]==3)			//得到终点坐标
				{
					endx=i;
					endy=j;
				}
			
			}
		}
		visit[startx][starty]=1;//出发点首次已被访问
        dfs(startx,starty); //  从当前开始搜索
        if(flag) 
			printf("YES\n"); //根据标记输出结果
        else    
			printf("NO\n");
	}
	return 0;
}


 

0.0分

2 人评分

  评论区

  • «
  • »