http://acm.zznu.edu.cn/problem.php?id=1967
这套题的有毒 我交了好多遍才对
坑:机关要按照顺序走 并且在走这个机关之前不能走这个机关 但是能穿过这个机关 所以不能把机关刚开始设成墙
要设成其他符号
#include <iostream> #include <cstring> #include <algorithm> #include <queue> #include <cstdio> #include <cstdlib> #include <cctype> #include <cmath> using namespace std; #define memset(a,b) memset(a,b,sizeof(a)) #define N 110 struct node { int x,y,step; }e[N]; char maps[N][N]; int n,m; int dis[8][2]={{1,0},{-1,0},{0,1},{0,-1},{-1,-1},{1,1},{-1,1},{1,-1}}; int vis[N][N]; int IF(int x,int y,int nx,int ny,int k) { if(maps[x][y]=='*' || maps[x][y]=='#' || x<0 || x>=n || y<0 || y>=m || vis[x][y]==1) return 0; if(k>=4) { if(k==4) { if(maps[x][y+1]=='#'&&maps[x+1][y]=='#') return 0; } if(k==5) { if(maps[x][y-1]=='#' && maps[x-1][y]=='#') return 0; } if(k==6) { if(maps[x][y-1]=='#' && maps[x+1][y]=='#') return 0; } if(k==7) { if(maps[x][y+1]=='#' && maps[x-1][y]=='#') return 0; } } return 1; } int bfs(node s,node o) { memset(vis,0); queue <node>Q; Q.push(s); vis[s.x][s.y]=1; while(Q.size()) { node p,q; p=Q.front(); Q.pop(); if(p.x==o.x && p.y==o.y) return p.step; for(int i=0;i<=7;i++) { q.x=p.x+dis[i][0]; q.y=p.y+dis[i][1]; if(IF(q.x,q.y,p.x,p.y,i)==1) { q.step=p.step+1; Q.push(q); vis[q.x][q.y]=1; } } } return -1; } int main() { int T,k; scanf("%d",&T); while(T--) { int flag=0; scanf("%d %d %d",&n,&m,&k); for(int i=0;i<n;i++) { scanf("%s",maps[i]); } for(int i=0;i<=k;i++) { scanf("%d %d",&e[i].x,&e[i].y); e[i].step=0; if(i!=0 && i!=1) { if(e[i].x==e[0].x && e[i].y==e[0].y) flag=1; } } if(flag==1) { printf("-1 "); continue; } int ans=0,sum=0;; for(int i=1;i<=k;i++) { for(int j=i+1;j<=k;j++) { maps[e[j].x-1][e[j].y-1]='*'; } node S,E; S.x=e[i-1].x-1; S.y=e[i-1].y-1; S.step=0; E.x=e[i].x-1; E.y=e[i].y-1; E.step=0; ans=bfs(S,E); if(ans==-1) { sum=-1; break; } else sum+=ans; for(int j=i+1;j<=k;j++) { maps[e[j].x-1][e[j].y-1]='.'; } } printf("%d ",sum); } return 0; }