Untitled
unknown
plain_text
a year ago
2.8 kB
16
Indexable
#pragma warning (disable:4996)
using namespace std;
int map[20][20];
int map_lua[20][20];
int map_ho[20][20];
int M, N, SR, SC;
int map_jew[20][20];
int visitLua[20][20];
int visitBackTrack[20][20];
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
int answer;
struct Queue{
int q[10000];
int front, rear;
void initQ(){
front = 0;
rear = 0;
}
bool isEmpty(){
return front == rear;
}
void push(int a){
q[rear] = a;
rear++;
}
int pop(){
int a = q[front];
front++;
return a;
}
};
void Lua(int x, int y){
Queue queue;
queue.initQ();
queue.push(x);
queue.push(y);
visitLua[x][y] = 1;
while(!queue.isEmpty()){
int hang = queue.pop();
int cot = queue.pop();
for(int i = 0; i < 4; i++){
int h = hang + dx[i];
int c = cot + dy[i];
if(h >= 1 && h <= M && c >= 1 && c <= N){
if(visitLua[h][c] > (visitLua[hang][cot] + 1) && map_ho[h][c] != 2){
queue.push(h);
queue.push(c);
visitLua[h][c] = visitLua[hang][cot] + 1;
}
}
}
}
}
bool check(int hang, int cot,int dem){
if(dem < visitLua[hang][cot]) return true;
return false;
}
void backTrack(int x, int y, int dem, int thuong){
if(!check(x, y, dem)){
return;
}
if(map[x][y] == 4){
if(answer < thuong){
answer = thuong;
}
}
for(int i = 0; i < 4; i++){
int h = x + dx[i];
int c = y + dy[i];
if(h > 0 && h <= M && c > 0 && c <= N && visitBackTrack[h][c] == 0){
if(map_ho[h][c] == 2){
if(check(x, y, dem)){
visitBackTrack[h][c] = 1;
backTrack(h, c, dem + 2, thuong + map_jew[h][c]);
visitBackTrack[h][c] = 0;
}
}else {
visitBackTrack[h][c] = 1;
backTrack(h, c, dem + 1, thuong + map_jew[h][c]);
visitBackTrack[h][c] = 0;
}
}
}
}
int main(){
freopen("Text.txt", "r", stdin);
int T; cin >> T;
for(int tc = 1; tc <= T; tc++){
cin >> M >> N >> SR >> SC;
int nDamChay; cin >> nDamChay;
// Reset map lua
for(int i = 1; i <= M; i++){
for(int j = 1; j <= N; j++){
map_lua[i][j] = 0;
map[i][j] = 0;
map_jew[i][j] = 0;
visitLua[i][j] = 999;
map_ho[i][j] = 0;
visitBackTrack[i][j] = 0;
}
}
for(int i = 0; i < nDamChay; i++){
int x, y; cin >> x >> y;
map_lua[x][y] = 1;
}
int nHo; cin >> nHo;
for(int i = 0; i < nHo; i++){
int x, y; cin >> x >> y;
map_ho[x][y] = 2;
}
int nLThoat; cin >> nLThoat;
for(int i = 0; i < nLThoat; i++){
int x, y; cin >> x >> y;
map[x][y] = 4;
}
map[SR][SC] = 3;
visitBackTrack[SR][SC] = 1;
for(int i = 1; i <= M; i++){
for(int j = 1; j <= N; j++){
cin >> map_jew[i][j];
if(map_lua[i][j] == 1){
Lua(i, j);
}
}
}
answer = -1;
backTrack(SR, SC, 1, map_jew[SR][SC]);
cout << "Case #" << tc << endl << answer << endl;
}
return 0;
}Editor is loading...
Leave a Comment