暴力搜索
看到这道题的第一反应就是直接上$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 }