「2018山东一轮集训」鸽子

    窝也不知道为什么反着BFS就是对的啊QWQ

#include<cstdio>
#define ll long long
using namespace std;
const int N=2005;

int n,k,m,B[2],E[2],H,T,px[N*N],py[N*N];
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
bool M[N][N],v[N][N];

inline bool read(){
	char ch=getchar();
	while(ch!='0'&&ch!='1') ch=getchar();
	return ch=='1';
}

inline bool solve(){
	if(M[B[0]][B[1]]||M[E[0]][E[1]]) return 0;
	
	px[H=T=1]=E[0],py[1]=E[1],v[E[0]][E[1]]=1;
	
	for(int x,y,X,Y,K=1;K<=k;K++){
		H=1;
		
		while(H<=T){
			x=px[H],y=py[H++];
			for(int i=0;i<4;i++){
				X=x+dx[i]*K,Y=y+dy[i]*K;
				if(X>=0&&X<n&&Y>=0&&Y<m&&!v[X][Y]&&!M[X][Y]) v[X][Y]=1,px[++T]=X,py[T]=Y;
			}
		}
		
		if(v[B[0]][B[1]]) return 1;
	}
	
	return 0;
}

int main(){
	scanf("%d%d%d",&n,&m,&k);
	scanf("%d%d%d%d",B,B+1,E,E+1);
	
	for(int i=0;i<n;i++)
	    for(int j=0;j<m;j++) M[i][j]=read();
	
	if(solve()) puts("Possible");
	else puts("Impossible");
	
	return 0;
}
原文地址:https://www.cnblogs.com/JYYHH/p/9190675.html