Untitled
unknown
plain_text
3 years ago
3.3 kB
7
Indexable
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#define MAX_SIZE 1000000
#define INF 10000000
using namespace std;
class Point{
public:
int x;
int y;
};
int Qx[MAX_SIZE], Qy[MAX_SIZE], front, rear;
void init(){
front = rear = -1;
}
void push(int x, int y){
rear++;
Qx[rear] = x;
Qy[rear] = y;
}
void pop(){
front++;
}
int topX(){
return Qx[front];
}
int topY(){
return Qy[front];
}
bool isEmpty(){
return front == rear;
}
int N, G;
int map[40][40] = {0};
Point postionGold[10] = {0};
int visited[100][100];
int vtHienTai[10] = {0};
int vtMin[10] = {0};
int minVt;
int numGold;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
void reset(){
for(int i = 0; i <= N; ++i){
for(int j = 0; j <= N; ++j){
visited[i][j] = INF;
}
}
for(int i = 0; i < 10; ++i){
vtHienTai[i] = -1;
}
}
void BFS(int x, int y){
reset();
init();
push(x, y);
visited[x][y] = 0;
bool ch = false;
while (!isEmpty())
{
pop();
int xx = topX();
int yy = topY();
for(int i = 0; i < 4; ++i){
int gx = xx + dx[i];
int gy = yy + dy[i];
if(gx >= 1 && gx <= N && gy >= 1 && gy <= N){
if(map[gx][gy] == 1 && visited[xx][yy] + 1 < visited[gx][gy]){
push(gx, gy);
visited[gx][gy] = visited[xx][yy] + 1;
}
else if(map[gx][gy] >= 2 && visited[xx][yy] + 1 < visited[gx][gy]){
push(gx, gy);
visited[gx][gy] = visited[xx][yy] + 1;
vtHienTai[map[gx][gy]-1] = visited[xx][yy] + 1;
ch = true;
}
}
}
}
if(ch == true){
int numgGoldHt = 0;
int maxHt = 0;
for(int i = 1; i <= G; i++){
if(vtHienTai[i] != -1){
numgGoldHt++;
if(vtHienTai[i] > maxHt){
maxHt = vtHienTai[i];
}
}
}
if(numgGoldHt > numGold){
numGold = numgGoldHt;
minVt = maxHt;
/*cout << "1NumgoldHt: " << numgGoldHt << " " << numGold
<< "MaxHt: " << maxHt << " " << minVt <<endl;*/
for(int i = 1; i <= G; i++){
vtMin[i] = vtHienTai[i];
}
}
else if(numgGoldHt == numGold){
/*cout << "2NumgoldHt: " << numgGoldHt << " " << numGold
<< "MaxHt: " << maxHt << " " << minVt <<endl;*/
if(maxHt < minVt){
minVt = maxHt;
for(int i = 1; i <= G; i++){
vtMin[i] = vtHienTai[i];
}
}
}
}
}
int main(){
//freopen("input.txt", "r", stdin);
int T;
cin >> T;
for(int tc = 1; tc <= T; ++tc){
cin >> N >> G;
for(int i = 1; i <= G; ++i){
vtMin[i] = -1;
cin >> postionGold[i].x >> postionGold[i].y;
}
for(int i = 1; i <= N; ++i){
for(int j = 1; j <= N; ++j){
cin >> map[i][j];
}
}
numGold = 0;
minVt = INF;
for(int i = 1; i <= G; ++i){
map[postionGold[i].x][postionGold[i].y] = i+1;
}
for(int i = 1; i <= N; ++i){
for(int j = 1; j <= N; ++j){
if(map[i][j] != 0){
BFS(i, j);
}
}
}
if(numGold == 0){
cout << "Case #" << tc << endl << -1 << endl;
}
else if(numGold < G){
cout << "Case #" << tc << endl << minVt << endl;
for(int i = 1; i <= G; i++){
if(vtMin[i] == -1){
cout << postionGold[i].x << " " << postionGold[i].y << endl;
}
}
}
else if(numGold == G){
cout << "Case #" << tc << endl << minVt << endl;
}
}
return 0;
}Editor is loading...