1 条题解

  • 0
    @ 2023-6-11 12:17:10

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    int head,tail,n,m,state[1000100][3],s,x,y,sx,sy,qx,qy;
    bool f[1010][1010];//标记点是否走过 
    int a[1010][1010];
    int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};//拓展方向
    void bfs()
    {
    	head=0;
    	tail=1;
    	state[1][0] = sx;
    	state[1][1] = sy; 
    	do
    	{
    		head++;//出队
    		for (int i=0;i<4;i++)//4个方向
    		{
    			x=state[head][0];y=state[head][1];
    			int j=1;
    			while (a[x+dx[i]*j][y+dy[i]*j] == 0 && x+dx[i]*j<=n && y+dy[i]*j<=m && x+dx[i]*j>0 && y+dy[i]*j>0)
    			//如果碰到墙或边缘就结束拓展
    			{
    			  if (f[x+dx[i]*j][y+dy[i]*j] == false)
    			  //如果已经走过的路线就不入队
    			  {
    			  	tail++;//入队
    			  	state[tail][0]=x+dx[i]*j;
    			  	state[tail][1]=y+dy[i]*j;//储存位置
    			  	state[tail][2]=state[head][2]+1;//储存转弯数
    			  	f[x+dx[i]*j][y+dy[i]*j]=true;//已经走过该地
    			  	if (x+dx[i]*j==qx && y+dy[i]*j==qy)//结束判断
    			  	{
    			  		s=state[tail][2];
    			  		return;
    			  	}
    			  }
    			  j++;//下一个拓展
    			}
    		}
    	}
    	while(head<tail);//空队退出
    }
    int main()
    {
    	cin>>n>>m;
    	for (int i=1;i<=n;i++)
    	{
    	  for (int j=1;j<=m;j++)
    	  {
    	  	cin>>a[i][j];
    	  }
    	}
    	cin>>sx>>sy>>qx>>qy;
    //	scanf("%d%d%d%d",&state[1][0],&state[1][1],&qx,&qy);
    	//输入不解释
    	bfs();//函数不解释
    	cout<<s-1<<endl;
    }
    
    • 1

    信息

    ID
    2364
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者