zoukankan      html  css  js  c++  java
  • [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
    ",ans);
    }
    

    拓展:

    有空写个整场的反省

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

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

  • 相关阅读:
    mybatis---demo1--(1-n)----bai
    字符流之文件读写流
    字节字符转换流
    字节缓冲流
    字节流之数据输入输出流
    字节流之文件输出流FileOutputStream
    【洛谷P3916】图的遍历
    【codevs1297】硬币 完全背包
    【codevs2205】等差数列
    【洛谷P1214】等差数列
  • 原文地址:https://www.cnblogs.com/zx0710/p/14115135.html
Copyright © 2011-2022 走看看