9252 分

Wrong Answer

0 分

#include<bits/stdc++.h>
using namespace std;
bool vis[505][505];
int n,m,t;
int sx,sy;
int ex,ey;
int dx[8]={-1,-2,-2,-1,1,2,2,1};
int dy[8]={-2,-1,1,2,2,1,-1,-2};
struct node{
	int x,y,step;
};


int bfs(){
	queue<node> q;
	q.push(node{sx,sy,0});//1.队首元素入队
	while(!q.empty()){//2.遍历队列,直到队列为空
		node f=q.front();//2.1 找到队首元素
		q.pop();//2.2存下队首元素后,队首元素出队
		for(int i=0;i<8;i++){//2.3遍历队首元素能到达的所有节点
			int nx=f.x+dx[i];
			int ny=f.y+dy[i];
			if(nx==ex&&ny==ey) return f.step+1;//2.4如果当前节点是答案,return结果
			if(nx>=0&&nx<n&&ny>=0&&ny<n&&!vis[nx][ny]){//2.5判断合法合法性
				//2.6入队
				vis[nx][ny]=1;//2.6.1 标记
				q.push(node{nx,ny,f.step+1});//2.6.2 入队
			}
		}
	}
	return -1;//3 无答案
}


int main(){
	cin>>t;
	while(t--){
		cin>>n>>m;
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++){
				
			}
		cin>>sx>>sy>>ex>>ey;
	}
	
	cout<<bfs();
	return 0;
}

方向数组应该只有4个

给你个伪代码

#include <bits/stdc++.h>
using namespace std;
int n,m,sx,sy,ex,ey;
int xx[]={1,-1,0,0};
int yy[]={0,0,-1,1};
char a[205][205];
int vis[505][505];
struct node{
  int x,y,step;
};
int bfs()//用广搜 
{
	queue<node> q;
	memset(vis,0,sizeof(vis));
	q.push(node{sx,sy,0});
	while(!q.empty())
	{
		node f=q.front();
	    q.pop();
	    for(int i=0;i<4;i++)
		{
		    int nx=f.x+xx[i];
		    int ny=f.y+yy[i];
		    if(nx==ex&&ny==ey) return f.step+1;
		    if(判断合法性)
			{
		        vis[nx][ny]=1;
		        q.push(node{nx,ny,f.step+1});
		    }
	    }
	}
	return -1;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
	    cin>>n>>m;
	    for(用i从1开始<=n)
	        for(用j从1开始<=m)
			{
		        cin>>a[i][j];
				if(a[i][j]=='S')
				{
					sx=i;
				    sy=j;
				}
				if(a[i][j]=='E')
				{
				    ex=i;
				    ey=j;
				}
		    }
		int 用变量存bfs;
		if(b==-1) cout<<"oop!\n";
		else cout<<b<<endl;
	}
	return 0;
}

离谱BUG

#include <iostream>  
#include <queue>  
#include <vector>  
#include <cstring>   
using namespace std;    
int dx[4] = {-1,0,1,0}; 
int dy[4] = {0,1,0,-1};   
char map[205][205];  
bool visited[205][205];  
int n, m;  
int bfs(int sx,int sy,int ex,int ey)
{  
    queue<pair<int,int>> q;  
    q.push({sx, sy});  
    visited[sx][sy]=true;  
    int steps=0;
    while (!q.empty())
	{  
        int size = q.size();  
        for (int i = 0; i < size; ++i)
		{  
            int x = q.front().first;  
            int y = q.front().second;  
            q.pop();  
  
            if (x == ex && y == ey)
                return steps;
            for (int j = 0; j < 4; ++j)
			{  
                int nx = x + dx[j];  
                int ny = y + dy[j];  
  
                if (nx>=0&&nx<n&&ny>=0&&ny<m&&map[nx][ny] != '#' && !visited[nx][ny])
				{  
                    q.push({nx, ny});  
                    visited[nx][ny] = true;  
                }  
            }  
        }  
        steps++;  
    }  
    return -1;  
}  
  
int main()
{  
    cin>>n>>m;  
    for (int i=0;i<n;i++)
        for (int j=0;j<m;j++)
            cin>>map[i][j];
    int yx,yy,qx,qy,hx, hy;
    for (int i=0;i<n;i++)
	{  
        for (int j=0;j<m;j++)
		{  
            if (map[i][j]=='Y')
			{  
                yx=i;  
                yy=j;  
            }  
            else if (map[i][j] == 'Q') 
			{  
                qx=i;  
                qy=j;  
            }  
            else if (map[i][j] == 'H')
			{  
                hx=i;  
                hy=j;  
            }  
        }  
    }  
    memset(visited, false, sizeof(visited));  
    int timeToQ = bfs(yx, yy, qx, qy);  
    if (timeToQ==-1)
	{  
        cout << "no way" << endl;  
        return 0;  
    }  
    memset(visited, false, sizeof(visited));   
    int timeToH = bfs(qx, qy, hx, hy);  
    if (timeToH == -1)
        cout << "no way" << endl;  
	else
        cout << timeToQ + timeToH << endl; 
    return 0;  
}