Untitled
unknown
plain_text
2 years ago
3.3 kB
7
Indexable
#include <iostream> using namespace std; #define MAX_SIZE 10000000 int front = -1; int rear = -1; int Arx[MAX_SIZE]; int Ary[MAX_SIZE]; int Id[MAX_SIZE]; class queue { public: bool isEmpty(); void push(int arx, int ary, int id); void pop(); void peek(int &arx, int &ary, int &id); }; bool queue :: isEmpty() { if(front == rear) { return true; } return false; } void queue :: push(int arx, int ary, int id) { front++; Arx[front] = arx; Ary[front] = ary; Id[front] = id; } void queue ::pop() { rear++; } void queue :: peek(int &arx, int &ary, int &id) { arx = Arx[rear + 1]; ary = Ary[rear + 1]; id = Id[rear + 1]; } int N; int arr[21][21]; int gold[21][21]; // dem so luong mo vang co the di duoc neu di tu vi tri do int street[21][21]; int vs[21][21]; void reset(int a[21][21]) { for(int i = 0; i < 21; i++) { for(int j = 0; j < 21; j++) { a[i][j] = 0; } } } int dx[] = { -1, 0, 0, 1}; int dy[] = { 0, 1, -1, 0}; // BFS tai cac vi tri co mo vang void BFS(int x1, int y1) { reset(vs); front = rear = -1; vs[x1][y1] = 1; int id = 0; queue qe; qe.push(x1, y1, id); while(!qe.isEmpty()) { int x, y; qe.peek(x, y, id); qe.pop(); for(int i = 0; i < 4; i++) { int t = x + dx[i]; int k = y + dy[i]; if(t >= 0 && t < N && k >= 0 && k < N) { if(vs[t][k] == 0 && arr[t][k] != 0) { // neu vi tri chua dc tham va khong phai da thi cho dem vang++ va con duong neu nho hon vt thi cap nhat xa nhat gold[t][k]++; if(street[t][k] < id + 1) { street[t][k] = id + 1; } qe.push(t, k, id + 1); vs[t][k] = 1; } } } } } int main() { //freopen("input.txt", "r", stdin); int testcase; cin >> testcase; for(int tc = 1; tc <= testcase; tc++) { cin >> N; reset(arr); reset(street); reset(gold); int vtx[5] = {0}; int vty[5] = {0}; int K; cin >> K; for(int i = 0; i < K; i++) { int x, y; cin >> x >> y; arr[x - 1][y - 1] = 2; vtx[i] = x - 1; vty[i] = y - 1; } for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { int x; cin >> x; if(arr[i][j] != 2) { arr[i][j] = x; } } } // BFS tai tung vi tri cua mo vang for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { if(arr[i][j] == 2) { BFS(i, j); } } } // vi co toi da k diem vang // khi xet thi uu tien cho vi tri co nhieu vang nhat int min = 10000; int x, y; for(int i1 = K; i1 >= 1; i1--) { int dk = 0; for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { if(gold[i][j] == i1 && arr[i][j] != 2) { if(min > street[i][j]) { dk = 1; min = street[i][j]; x = i; y = j; } } } } if(dk == 1) { break; } } if(min == 10000) { cout<<"Case #"<<tc<<endl<<-1<<endl; } else { BFS(x, y); cout<<"Case #"<<tc<<endl<<min<<endl; for(int i = 0; i < K; i++) { if(vs[vtx[i]][vty[i]] == 0) { cout<<vtx[i] + 1 <<" "<<vty[i] + 1<<endl; } } } } }
Editor is loading...