Untitled

 avatar
unknown
plain_text
2 years ago
4.6 kB
20
Indexable
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int N,M,xstart,ystart,P,A[51][51];
int visit[51][51],f,r,mQ[1000000],ans;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void push(int x){
	r++;
	mQ[r]=x;
}
int pop(){
	f++;
	return mQ[f];
}
void input(){
	cin>>N>>M>>xstart>>ystart>>P;
	for(int i=0;i<N;i++){
		for(int j=0;j<M;j++){
			visit[i][j]=0;
			cin>>A[i][j];
		}
	}
}
void BFS(){
	f=r=-1;
	push(xstart);
	push(ystart);
	visit[xstart][ystart]=1;
	while(f!=r){
		int x=pop();
		int y=pop();
		if(visit[x][y]>P) break;
		if(A[x][y]==1){
			for(int i=0;i<4;i++){
				int xx=x+dx[i];
				int yy=y+dy[i];
				if(xx<0||xx>=N||yy<0||yy>=M||A[xx][yy]==0) continue;
				if(i==0&&(A[xx][yy]==2||A[xx][yy]==4||A[xx][yy]==5)) continue;
				if(i==1&&(A[xx][yy]==2||A[xx][yy]==6||A[xx][yy]==7)) continue;
				if(i==2&&(A[xx][yy]==3||A[xx][yy]==5||A[xx][yy]==6)) continue;
				if(i==3&&(A[xx][yy]==3||A[xx][yy]==4||A[xx][yy]==7)) continue;
				if(visit[xx][yy]==0){
					visit[xx][yy]=visit[x][y]+1;
					push(xx);push(yy);
				}else if(visit[xx][yy]>visit[x][y]+1){
					visit[xx][yy]=visit[x][y]+1;
					push(xx);push(yy);
				}
			}
		}else if(A[x][y]==3){
			for(int i=0;i<2;i++){
				int xx=x+dx[i];
				int yy=y+dy[i];
				if(xx<0||xx>=N||yy<0||yy>=M||A[xx][yy]==0) continue;
				if(i==0&&(A[xx][yy]==2||A[xx][yy]==4||A[xx][yy]==5)) continue;
				if(i==1&&(A[xx][yy]==2||A[xx][yy]==6||A[xx][yy]==7)) continue;
				if(visit[xx][yy]==0){
					visit[xx][yy]=visit[x][y]+1;
					push(xx);push(yy);
				}else if(visit[xx][yy]>visit[x][y]+1){
					visit[xx][yy]=visit[x][y]+1;
					push(xx);push(yy);
				}
			}
		}else if(A[x][y]==2){
			for(int i=2;i<4;i++){
				int xx=x+dx[i];
				int yy=y+dy[i];
				if(xx<0||xx>=N||yy<0||yy>=M||A[xx][yy]==0) continue;
				if(i==2&&(A[xx][yy]==3||A[xx][yy]==5||A[xx][yy]==6)) continue;
				if(i==3&&(A[xx][yy]==3||A[xx][yy]==4||A[xx][yy]==7)) continue;
				if(visit[xx][yy]==0){
					visit[xx][yy]=visit[x][y]+1;
					push(xx);push(yy);
				}else if(visit[xx][yy]>visit[x][y]+1){
					visit[xx][yy]=visit[x][y]+1;
					push(xx);push(yy);
				}
			}
		}else if(A[x][y]==6){
			for(int i=1;i<3;i++){
				int xx=x+dx[i];
				int yy=y+dy[i];
				if(xx<0||xx>=N||yy<0||yy>=M||A[xx][yy]==0) continue;
				if(i==1&&(A[xx][yy]==2||A[xx][yy]==6||A[xx][yy]==7)) continue;
				if(i==2&&(A[xx][yy]==3||A[xx][yy]==5||A[xx][yy]==6)) continue;
				if(visit[xx][yy]==0){
					visit[xx][yy]=visit[x][y]+1;
					push(xx);push(yy);
				}else if(visit[xx][yy]>visit[x][y]+1){
					visit[xx][yy]=visit[x][y]+1;
					push(xx);push(yy);
				}
			}
		}else if(A[x][y]==5){
			for(int i=0;i<3;i++){
				if(i==1) continue;
				int xx=x+dx[i];
				int yy=y+dy[i];
				if(xx<0||xx>=N||yy<0||yy>=M||A[xx][yy]==0) continue;
				if(i==0&&(A[xx][yy]==2||A[xx][yy]==4||A[xx][yy]==5)) continue;
				if(i==2&&(A[xx][yy]==3||A[xx][yy]==5||A[xx][yy]==6)) continue;
				if(visit[xx][yy]==0){
					visit[xx][yy]=visit[x][y]+1;
					push(xx);push(yy);
				}else if(visit[xx][yy]>visit[x][y]+1){
					visit[xx][yy]=visit[x][y]+1;
					push(xx);push(yy);
				}
			}
		}else if(A[x][y]==4){
			for(int i=0;i<4;i++){
				if(i==1||i==2) continue;
				int xx=x+dx[i];
				int yy=y+dy[i];
				if(xx<0||xx>=N||yy<0||yy>=M||A[xx][yy]==0) continue;
				if(i==0&&(A[xx][yy]==2||A[xx][yy]==4||A[xx][yy]==5)) continue;
				if(i==3&&(A[xx][yy]==3||A[xx][yy]==4||A[xx][yy]==7)) continue;
				if(visit[xx][yy]==0){
					visit[xx][yy]=visit[x][y]+1;
					push(xx);push(yy);
				}else if(visit[xx][yy]>visit[x][y]+1){
					visit[xx][yy]=visit[x][y]+1;
					push(xx);push(yy);
				}
			}
		}else {
			for(int i=1;i<4;i++){
				if(i==2) continue;
				int xx=x+dx[i];
				int yy=y+dy[i];
				if(xx<0||xx>=N||yy<0||yy>=M||A[xx][yy]==0) continue;
				if(i==1&&(A[xx][yy]==2||A[xx][yy]==6||A[xx][yy]==7)) continue;
				if(i==3&&(A[xx][yy]==3||A[xx][yy]==4||A[xx][yy]==7)) continue;
				if(visit[xx][yy]==0){
					visit[xx][yy]=visit[x][y]+1;
					push(xx);push(yy);
				}else if(visit[xx][yy]>visit[x][y]+1){
					visit[xx][yy]=visit[x][y]+1;
					push(xx);push(yy);
				}
			}
		}
	}

}
int main(int argc, char** argv)
{
	int test_case;
	int T;
	freopen("input.txt", "r", stdin);
	cin >> T;

	for(test_case = 1; test_case <= T; ++test_case)
	{
		input();
		ans=0;
		BFS();
		for(int i=0;i<N;i++){
			for(int j=0;j<M;j++){
				if(visit[i][j]>0&&visit[i][j]<=P)
					ans++;
			}
		}
		
		cout << "Case #" << test_case << endl << ans << endl;
	}
	return 0;
}
Editor is loading...