[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,去补一下