60分求助,不知道哪错了,在第四个点挂了
查看原帖
60分求助,不知道哪错了,在第四个点挂了
245085
wenxutong楼主2022/12/27 20:42

我的评测记录

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
struct point{
    int x,y,step;
    int tar;
    int cnt;
};
int n,m;
int ex,ey;
int dx[5]={1,-1,0,0,0};
int dy[5]={0,0,1,-1,0};
point q[2000005];
bool a[105][105];//1--障碍,0--空地
bool used[105][105][4][7];
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n>>m>>q[1].x>>q[1].y>>ex>>ey;
    q[1].step=0,q[1].tar=0,q[1].cnt=0;
    q[2]=q[1],q[3]=q[1],q[4]=q[1];
    q[2].tar=1,q[3].tar=2,q[4].tar=3;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            int tmp;
            cin>>tmp;
            a[i][j]=(bool)(tmp==0);
        }
    }
    for(int K=1;K<=10;K++){
        int f=1,e=4;
        memset(used,0,sizeof(used));
        bool flag=0;
        while(f<=e){
            point u=q[f];
            f++;
            bool cou=(bool)(u.cnt>=K);
            if(u.x<1||u.x>n||u.y<1||u.y>m||used[u.x][u.y][(int)cou][u.tar]==1||a[u.x][u.y]==1)continue;
            used[u.x][u.y][(int)cou][u.tar]=1;
            if(u.x==ex&&u.y==ey){
                cout<<K<<" "<<u.step<<"\n";
                flag=1;
                break;
            }
            e++;
            q[e].x=u.x+dx[u.tar],q[e].y=u.y+dy[u.tar],q[e].step=u.step+1,q[e].cnt=u.cnt+1,q[e].tar=u.tar;
            if(u.cnt>=K){
                u.cnt=0;
                for(int i=0;i<4;i++){
                    if(i==u.tar)continue;
                    e++;
                    q[e].x=u.x+dx[i],q[e].y=u.y+dy[i],q[e].step=u.step+1,q[e].cnt=u.cnt+1,q[e].tar=i;
                }
            }
        }
        if(flag==0)break;
    }
    return 0;
}

主要思路就是bfs,里面记录了x,y坐标、走了几步(step),现在的方向(tar),在这个方向上走了几步(cnt),

都定义在那个结构体里

然后used就是判断有无走过重复情况,四个下标分别是x,y坐标、能否转向(cou),方向

2022/12/27 20:42
加载中...