Untitled

 avatar
unknown
plain_text
2 years ago
3.3 kB
10
Indexable
#include<iostream>
#define MAX_QUEUE 100000

using namespace std;

int N,M,P;
int map[51][51];
int visit[51][51];
int x_hugo, y_hugo;
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
int lienkettong[4][4] = {{1,2,5,6},{1,3,6,7},{1,2,4,7},{1,3,4,5}};
int ans;

class Queue
{
	int front;
	int rear;
	int A[MAX_QUEUE];
public:
	Queue();
	bool is_Empty();
	void enQueue(int inValue);
	int deQueue();
	void reset();
private:

};

Queue::Queue()
{
	front = rear = -1;
}

bool Queue::is_Empty(){
	if(front == rear)
		return 1;
	return 0;
}

void Queue::enQueue(int inValue){
	rear++;
	A[rear] = inValue;
}

int Queue::deQueue(){
	front++;
	return A[front];
}

void Queue::reset(){
	front = rear = -1;
}

Queue pos;

void BFS(){
	pos.reset();
	pos.enQueue(x_hugo);
	pos.enQueue(y_hugo);
	visit[x_hugo][y_hugo] = 1;
	int x,y;
	while(!pos.is_Empty()){
		ans++;
		x = pos.deQueue();
		y = pos.deQueue();
		int xx,yy;
		for (int i = 0; i < 4; i++){
			xx = x + dx[i];
			yy = y + dy[i];
			if(xx >= 0 && xx < N && yy >= 0 && yy < M && visit[xx][yy] == 0 && visit[x][y] < P){
				if(map[x][y] == 1){  // ong 1
					for (int j = 0; j < 4; j++){
						if(lienkettong[i][j] == map[xx][yy]){
							pos.enQueue(xx);
							pos.enQueue(yy);
							visit[xx][yy] = visit[x][y] + 1;
						}
					}
				}
				else if(map[x][y] == 2 && (i == 0 || i == 2)){ // ong 2
					for (int j = 0; j < 4; j++){
						if(lienkettong[i][j] == map[xx][yy]){
							pos.enQueue(xx);
							pos.enQueue(yy);
							visit[xx][yy] = visit[x][y] + 1;
						}
					}
				}
				else if(map[x][y] == 3 && (i == 1 || i == 3)){ // ong 3
					for (int j = 0; j < 4; j++){
						if(lienkettong[i][j] == map[xx][yy]){
							pos.enQueue(xx);
							pos.enQueue(yy);
							visit[xx][yy] = visit[x][y] + 1;
						}
					}
				}
				else if(map[x][y] == 4 && (i == 0 || i == 1)){ // ong 4
					for (int j = 0; j < 4; j++){
						if(lienkettong[i][j] == map[xx][yy]){
							pos.enQueue(xx);
							pos.enQueue(yy);
							visit[xx][yy] = visit[x][y] + 1;
						}
					}
				}
				else if(map[x][y] == 5 && (i == 1 || i == 2)){ // ong 5
					for (int j = 0; j < 4; j++){
						if(lienkettong[i][j] == map[xx][yy]){
							pos.enQueue(xx);
							pos.enQueue(yy);
							visit[xx][yy] = visit[x][y] + 1;
						}
					}
				}
				else if(map[x][y] == 6 && (i == 2 || i == 3)){ // ong 6
					for (int j = 0; j < 4; j++){
						if(lienkettong[i][j] == map[xx][yy]){
							pos.enQueue(xx);
							pos.enQueue(yy);
							visit[xx][yy] = visit[x][y] + 1;
						}
					}
				}
				else if(map[x][y] == 7 && (i == 0 || i == 3)){ // ong 7
					for (int j = 0; j < 4; j++){
						if(lienkettong[i][j] == map[xx][yy]){
							pos.enQueue(xx);
							pos.enQueue(yy);
							visit[xx][yy] = visit[x][y] + 1;
						}
					}
				}
			}
		}
	}
}

int main(){
	freopen("input.txt","r",stdin);
	int T;
	cin >> T;
	for (int tc = 1; tc <= T; tc++){
		cin >> N >> M >> x_hugo >> y_hugo >> P;
		for (int i = 0; i < N; i++){
			for (int j = 0; j < M; j++){
				cin >> map[i][j];
				visit[i][j] = 0;
			}
		}
		ans = 0;
		BFS();
		cout << "Case #" << tc << endl << ans << endl;
	}
	return 0;
}
Editor is loading...