Untitled
unknown
plain_text
2 years ago
2.5 kB
8
Indexable
#include<iostream>
using namespace std;
int n, g, check;
int gold[5][2];
int visgold[5];
int visitgold[5];
int arr[21][21];
int visit[21][21];
int Qx[1000000];
int Qy[1000000];
int front, rear;
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
int Answer, cntgold;
void push(int x, int y) {
rear++;
Qx[rear]=x;
Qy[rear]=y;
}
void pop(int &x, int &y) {
front++;
x=Qx[front];
y=Qy[front];
}
void bfs(int x, int y) {
front = rear = -1;
push(x,y);
visit[x][y] = 0;
while (front < rear) {
pop(x,y);
for (int i = 0; i < 4; i++) {
int xx = x + dx[i];
int yy = y + dy[i];
if (xx >= 1 && xx <= n && yy >= 1 && yy <= n) {
if (visit[xx][yy] == 0 && arr[xx][yy] != 0) {
visit[xx][yy] = visit[x][y] + 1;
push(xx,yy);
}
}
}
}
int cnt = 0;
int min = 0;
for (int i = 1; i <= g; i++) {
visitgold[i]=0;
}
for (int i = 1; i <= g; i++) {
if (visit[gold[i][0]][gold[i][1]] > 0) {
cnt++;
visitgold[i]=1;
if (min < visit[gold[i][0]][gold[i][1]]) {
min = visit[gold[i][0]][gold[i][1]];
}
}
}
if (cnt>0) {
check = 1;
if (cnt>cntgold) {
cntgold=cnt;
Answer=min;
for (int i = 1; i <= g; i++) {
visgold[i] = visitgold[i];
}
} else if (cnt==cntgold) {
if (min < Answer) {
Answer = min;
for (int i = 1; i <= g; i++) {
visgold[i] = visitgold[i];
}
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
visit[i][j] = 0;
}
}
}
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)
{
check = 0;
cntgold=0;
Answer = 100000;
cin >> n >> g;
for (int i = 1; i <= g; i++) {
cin >> gold[i][0] >> gold[i][1];
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> arr[i][j];
}
}
for (int i = 1; i <= g; i++) {
arr[gold[i][0]][gold[i][1]] = 2;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (arr[i][j] == 1 && visit[i][j] == 0) {
bfs(i, j);
}
}
}
cout << "Case #" << test_case << endl;
if (check == 0) cout << "-1" << endl;
else {
cout << Answer << endl;
if (cntgold != g) {
for (int i = 1; i <= g; i++) {
if (visgold[i] == 0) {
cout << gold[i][0] << ' ' << gold[i][1] << endl;
}
}
}
}
}
return 0;//Your program should return 0 on normal termination.
}Editor is loading...