题目传送门

暴力搜索

看到这道题的第一反应就是直接上$bfs$啦,也没有想到什么更加优秀的算法。

然后就是$15$分钟打了$70$分,有点震惊,纯暴力诶,这么多白给分嘛,太划算了,这可是$D2T3$诶。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<vector>
 4 #include<cstring>
 5 #include<queue>
 6 #include<map>
 7 #include<iostream>
 8 #include<cmath>
 9 using namespace std;
10 #define ll long long
11 #define INF 0x3f3f3f3f
12 #define N 35
13 int rd()
14 {
15     int f=1,s=0;char c=getchar();
16     while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
17     while(c>='0'&&c<='9'){s=(s<<3)+(s<<1)+(c^48);c=getchar();}
18     return f*s;
19 }
20 struct node{
21     int mx,my,nx,ny;//空格的位置,初始棋子现在的位置
22     int stp;//步数 
23 };
24 int n,m,q;
25 int mp[N][N];
26 int ex,ey,sx,sy,tx,ty;
27 queue<node>Q;
28 const int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
29 bool vis[N][N][N][N];
30 bool check(int xx,int yy)
31 {
32     if(xx<0||xx>n||yy<0||yy>m||mp[xx][yy]==0) return 0;
33     return 1;
34 }
35 int main() 
36 {
37     n=rd(),m=rd(),q=rd();
38     for(int i=1;i<=n;i++)
39         for(int j=1;j<=m;j++)
40             mp[i][j]=rd();
41     while(q--)
42     {
43         ex=rd(),ey=rd(),sx=rd(),sy=rd(),tx=rd(),ty=rd();
44         if(sx==tx&&sy==ty)
45         {//下面村答案是在拓展节点之后存 所以这里要特判 
46             puts("0");//如果取出时存答案就不用特判(好像也不用break很多层了 
47             continue; 
48         }
49         memset(vis,0,sizeof(vis));
50         bool flag=0;
51         while(!Q.empty()) Q.pop();
52         node s;s.mx=ex,s.my=ey,s.nx=sx,s.ny=sy,s.stp=0;
53         vis[ex][ey][sx][sy]=1;
54         Q.push(s);
55         while(!Q.empty())
56         {
57             s=Q.front();Q.pop();
58             for(int i=0;i<4;i++)
59             {
60                 node nxt;
61                 nxt.mx=s.mx+dx[i],nxt.my=s.my+dy[i];
62                 if(!check(nxt.mx,nxt.my)) continue;
63                 if(nxt.mx==s.nx&&nxt.my==s.ny) nxt.nx=s.mx,nxt.ny=s.my;
64                 else nxt.nx=s.nx,nxt.ny=s.ny;
65                 nxt.stp=s.stp+1;
66                 if(nxt.nx==tx&&nxt.ny==ty)
67                 {
68                     flag=1;
69                     printf("%d\n",nxt.stp);
70                     break;
71                 }
72                 if(vis[nxt.mx][nxt.my][nxt.nx][nxt.ny]) continue;
73                 Q.push(nxt);
74                 vis[nxt.mx][nxt.my][nxt.nx][nxt.ny]=1;
75             }
76             if(flag) break;
77         }
78         if(flag) continue;
79         else puts("-1");
80     }
81     return 0;
82 }
Code

相关文章: