[2020.12.10周四]团队排位赛 A题 模拟

[2020.12.10周四]团队排位赛 A题 模拟

题意:模拟题,所以只讲题目大意6x6的格子,有一个出口和很多辆车,要把红车移到出口。

题解:深搜直接模拟

注意点:因为太久没摸大模拟了(主要是根本就不太会模拟,换成王老板键盘一摸就过了),导致写出来的bug比代码还多。非常感谢昨天胡老板帮我debug。

当时赛场上没跑出来的点,注释标出来了,就是\(a[xx][yy]!=car\),那个方向是car,也可以往那个方向移。其他没问题。

但赛后补题的时候发现,读题太离谱了。

读错了两个地方,一个是横着放的车只能左右移动,二是终点是定死的那个点而不是四面八方都能出去。

#include<bits/stdc++.h>
using namespace std;
#define debug(x) cout<<#x<<':'<<x<<endl;
#define x first
#define y second
int ans=11;
int a[10][10];
int X[4]={0,-1,0,1};
int Y[4]={1,0,-1,0};
vector<pair<int,int>> G[15];
int numcar=0;
bool check(int car ,int j)
{
    for(auto q:G[car])
    {
        int xx=q.x+X[j],yy=q.y+Y[j];
        if(xx<1 || yy<1 || xx>6 || yy>6) {return false;}
        if(a[xx][yy] !=0&&a[xx][yy]!=car) {return false;}//本地debug没debug出来的点
    }
    return true;
}
bool f(int deep)
{
    //第一个读错题目的点
    if(G[1][1].x==3&&G[1][1].y==6){ans=min(2+deep,ans);return true;}
    return false;
}

void dfs(int deep,int pre,int pre2)
{
  if(f(deep)) return;
  if (deep>10) return ;

  if(abs(G[1][1].x-3)+abs(G[1][1].y-6)+deep+2>=ans) return ;
    for(int i=1;i<=numcar;i++)
    {
        for(int j=0;j<4;j++)
        {
            //第二个读错题目的点
            if(G[i][0].x==G[i][1].x){//横着
                if(j==1||j==3) continue;
            }
            else {
                if(j==0||j==2) continue;
            }
           if(i==pre&&abs(j-pre2)==2) continue;
            if(check(i,j))
            {
                 for(auto &q:G[i])
                 {
                    a[q.x][q.y]=0;
                    q.x+=X[j];q.y+=Y[j];
                 }
                 for(auto &q:G[i])a[q.x][q.y]=i;

                dfs(deep+1,i,j);
                for(auto &q:G[i])
                {
                      a[q.x][q.y]=0;
                      q.x-=X[j]; q.y-=Y[j];
                }
                for(auto &q:G[i]){a[q.x][q.y]=i;}
            }
        }
    }
}
int main(){

    for (int i=1; i<=6; i++)
        for (int j=1; j<=6; j++){
                cin>>a[i][j],G[a[i][j]].push_back({i,j});
                numcar=max(numcar,a[i][j]);
        }
    if(G[1][0].x!=G[1][1].x) {puts("-1");return 0;}
    dfs(0,-10,-10);
    if(ans==11) puts("-1");
    else printf("%d\n",ans);
}

拓展:

有空写个整场的反省

1.B是个树形dp,我觉得可补

2,M是个数论题,学完crt,去补一下

posted @ 2020-12-10 15:07  zx0710  阅读(76)  评论(0编辑  收藏  举报