额。。闲着无聊去打。。然后出事情了。。。
出题人喜欢玩语文姿势。。。
坑在了他开关碰完以后,居然消失的意思是 这个grid变成合法' . ';!!!不可理喻啊!!!
思路:
BFS,8个方向,四个角还要判断一下。
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N=1e2+10; int dx[8]={0,0,1,-1,-1,1,1,-1}; int dy[8]={-1,1,0,0,-1,1,-1,1}; struct Node{ int x,y; }node[15]; struct asd{ int x,y; int step; }; queue<asd>q; int n,m,k; bool vis[N][N]; char ma[N][N]; int BFS(int sx,int sy,int ex,int ey){ asd now,nex; memset(vis,false,sizeof(vis)); while(!q.empty()) q.pop(); now.x=sx;now.y=sy; now.step=0; vis[sx][sy]=true; q.push(now); while(!q.empty()){ now=q.front();q.pop(); if(now.x==ex && now.y==ey) return now.step; for(int i=0;i<8;i++){ int x=now.x+dx[i]; int y=now.y+dy[i]; if(x<0||y<0||x>=n||y>=m||ma[x][y]!='.'||vis[x][y]) continue; if(i>=4 && ma[now.x][now.y+dy[i]]=='#' && ma[now.x+dx[i]][now.y]=='#' ) continue; nex.x=x;nex.y=y;nex.step=now.step+1; vis[x][y]=true; q.push(nex); } } return -1; } int main(){ int T; scanf("%d",&T); while(T--){ int sx,sy,ex,ey; scanf("%d%d%d",&n,&m,&k); for(int i=0;i<n;i++) scanf("%s",ma[i]); scanf("%d%d",&sx,&sy); sx--;sy--; bool flag=true; for(int i=0;i<k;i++) { scanf("%d%d",&ex,&ey); ex--;ey--; ma[ex][ey]='*'; if(i>0 && ex==sx &&ey== sy) flag=false; node[i].x=ex;node[i].y=ey; } int ans=0,temp; for(int i=0;i<k;i++){ ex=node[i].x;ey=node[i].y; if(!flag) break; ma[ex][ey]='.'; temp=BFS(sx,sy,ex,ey); if(temp==-1) flag=false; ans+=temp; sx=ex;sy=ey; } if(!flag) ans=-1; printf("%d\n",ans); } return 0; }