其实此题很水,要不本菜也不会~~
主要考虑的就是用防守队员的左上角坐标,其他位置则用相对坐标的形式保存起来,然后每加入一个结点都判断一次
code
/* ID: yueqiq PROG: numtri LANG: C++ */ #include <set> #include <map> #include <ctime> #include <queue> #include <cmath> #include <stack> #include <limits> #include <vector> #include <bitset> #include <string> #include <cstdio> #include <cstring> #include <fstream> #include <string.h> #include <iostream> #include <algorithm> #define Si set<int> #define LL long long #define pb push_back #define PS printf(" ") #define Vi vector<int> #define LN printf("\n") #define lson l,m,rt << 1 #define rson m+1,r,rt<<1|1 #define SD(a) scanf("%d",&a) #define PD(a) printf("%d",a) #define SET(a,b) memset(a,b,sizeof(a)) #define FF(i,a) for(int i(0);i<(a);i++) #define FD(i,a) for(int i(a);i>=(1);i--) #define FOR(i,a,b) for(int i(a);i<=(b);i++) #define FOD(i,a,b) for(int i(a);i>=(b);i--) #define readf freopen("input.txt","r",stdin) #define writef freopen("output.txt","w",stdout) const int maxn = 101; const int INF = 1111; const int dx[]={0,1,0,-1}; const int dy[]={1,0,-1,0}; const double pi = acos(-1.0); const double eps= 1e-7; using namespace std; int H,W; char Map[maxn][maxn]; bool vis[maxn][maxn]; int sx,sy,v,relx[maxn],rely[maxn]; struct node{ int x,y,step; }; int canmove(int nx,int ny){ bool flag=false; if(vis[nx][ny]) return -1; FF(i,v){ int tx=nx+relx[i]; int ty=ny+rely[i]; if(tx<1 || ty<1 ||tx>H || ty>W) return -1; if( Map[tx][ty]=='O') return -1; if(Map[tx][ty]=='Q') flag=true; } if(flag) return 0; return 1; } int bfs(){ node cur,tmp; queue<node> q; cur.step=0; cur.x=sx; cur.y=sy; vis[sx][sy]=true; q.push(cur); while(!q.empty()){ tmp=q.front(); q.pop(); if(Map[tmp.x][tmp.y]=='Q') return tmp.step; FF(i,4){ cur.x=tmp.x+dx[i]; cur.y=tmp.y+dy[i]; cur.step=tmp.step+1; if(!canmove(cur.x,cur.y)) return cur.step; if(canmove(cur.x,cur.y)==1){ vis[cur.x][cur.y]=true; q.push(cur); } } } return -1; } int main() { while(~scanf("%d%d",&H,&W),H+W){ bool flag=true; v=0; SET(vis,false); FOR(i,1,H) FOR(j,1,W){ scanf(" %c",&Map[i][j]); if(Map[i][j]=='D'){ if(flag){ sx=i;sy=j;flag=false; } if(!flag){ relx[v]=i-sx; rely[v]=j-sy; } v++; } } int k=bfs(); if(k==-1) printf("Impossible"); else PD(k);LN; } return 0; }