| Task: | Godzilla |
| Sender: | KnowYourArchitecture |
| Submission time: | 2017-10-17 20:36:46 +0300 |
| Language: | C++ |
| Status: | READY |
| Result: | WRONG ANSWER |
| test | verdict | time | |
|---|---|---|---|
| #1 | WRONG ANSWER | 0.04 s | details |
| #2 | ACCEPTED | 0.04 s | details |
| #3 | WRONG ANSWER | 0.04 s | details |
| #4 | WRONG ANSWER | 0.06 s | details |
| #5 | WRONG ANSWER | 0.09 s | details |
| #6 | WRONG ANSWER | 0.09 s | details |
| #7 | ACCEPTED | 0.12 s | details |
| #8 | WRONG ANSWER | 0.22 s | details |
| #9 | WRONG ANSWER | 0.42 s | details |
| #10 | WRONG ANSWER | 0.23 s | details |
| #11 | WRONG ANSWER | 0.41 s | details |
| #12 | ACCEPTED | 0.12 s | details |
| #13 | ACCEPTED | 0.19 s | details |
| #14 | ACCEPTED | 0.04 s | details |
Compiler report
input/code.cpp: In function 'int main()':
input/code.cpp:109:21: warning: 'Gy' may be used uninitialized in this function [-Wmaybe-uninitialized]
if(lookup(Gy-1,Gx)=='R')--Gy,++r;
^
input/code.cpp:15:8: warning: 'Gx' may be used uninitialized in this function [-Wmaybe-uninitialized]
if(x<0||y<0||x>=L||y>=W)return (char)0;
^Code
#include <bits/stdc++.h>
using namespace std;
int main(){
int Tn;
cin>>Tn;
while(Tn--){
// Read input
int L,W;
cin>>L>>W;
vector<string> g(W);
for(auto& it : g)cin>>it;
// Function for getting value in g with bound checking
auto lookup = [&](int y,int x){
if(x<0||y<0||x>=L||y>=W)return (char)0;
else return g[y][x];
};
// Queue for bfs for mechs
queue<tuple<int,int>> qM;
// What mechs can see
// bit 0 means y-direction
// bit 1 means x-direction
// bit 2 means mech has visited
vector<vector<int>> l(W);
for(auto& it : l)it.resize(L);
// Get value from mechs line-of-sight
auto lookup_l = [&](int y,int x){
if(x<0||y<0||x>=L||y>=W)return 4;
else return l[y][x];
};
// Result, that is how many houses have been destroyed
int r=0;
// Extend beams horizontally and vertically
auto update_beams = [&](int i,int j){
// Check in y-direction
if((lookup_l(i-1,j)&1) || (lookup_l(i+1,j)&1)){
// Extend south
for(int k=i;k<W;++k){
if(lookup(k,j)=='R' || (lookup_l(k,j)&1))break;
l[k][j]|=1;
}
// Extend north
for(int k=i-1;k>=0;--k){
if(lookup(k,j)=='R'|| (lookup_l(k,j)&1))break;
l[k][j]|=1;
}
}
// Check in x-direction
if((lookup_l(i,j-1)&2) || (lookup_l(i,j+1)&2)){
// Extend east
for(int k=j;k<L;++k){
if(lookup(i,k)=='R'||(lookup_l(i,k)&2))break;
l[i][k]|=2;
}
// Extend west
for(int k=j-1;k>=0;--k){
if(lookup(i,k)=='R'||(lookup_l(i,k)&2))break;
l[i][k]|=2;
}
}
};
auto cast_beam = [&](int i,int j){
// Cast south
for(int k=i;k<W;++k){
if(lookup(k,j)=='R'||(lookup_l(k,j)&1))break;
l[k][j]|=1;
}
// Cast north
for(int k=i-1;k>=0;--k){
if(lookup(k,j)=='R'||(lookup_l(k,j)&1))break;
l[k][j]|=1;
}
// Cast east
for(int k=j;k<L;++k){
if(lookup(i,k)=='R'||(lookup_l(i,k)&2))break;
l[i][k]|=2;
}
// Cast west
for(int k=j-1;k>=0;--k){
if(lookup(i,k)=='R'||(lookup_l(i,k)&2))break;
l[i][k]|=2;
}
};
// Position of gotzilla
int Gx,Gy;
for(int i=0;i<W;++i){
for(int j=0;j<L;++j){
// Add mech to bfs queue, cast beam and mark visited
if(lookup(i,j)=='M') {
qM.emplace(i,j);
cast_beam(i,j);
l[i][j]|=4;
}
// Get position of gotzilla
if(lookup(i,j)=='G')Gx=j,Gy=i;
}
}
while(true){
// Update the position of gotzilla
// First try moving on residental
if(lookup(Gy-1,Gx)=='R')--Gy,++r;
else if(lookup(Gy,Gx+1)=='R')++Gx,++r;
else if(lookup(Gy+1,Gx)=='R')++Gy,++r;
else if(lookup(Gy,Gx-1)=='R')--Gx,++r;
// Then try moving on empty, non-visited cells
else if(lookup(Gy-1,Gx)!='G'&&lookup(Gy-1,Gx))--Gy;
else if(lookup(Gy,Gx+1)!='G'&&lookup(Gy,Gx+1))++Gx;
else if(lookup(Gy+1,Gx)!='G'&&lookup(Gy+1,Gx))++Gy;
else if(lookup(Gy,Gx-1)!='G'&&lookup(Gy,Gx-1))--Gx;
// Mark visited
g[Gy][Gx]='G';
// Update beams
update_beams(Gy,Gx);
// Move all mechs
int vv = qM.size();
while(vv--){
// Get the position of mech
int i,j;
tie(i,j) = qM.front();qM.pop();
// Check that no mech has been there and it is not residental
// Then cast beam from new postion, mark it as visited and add the new position to the queue
if((~lookup_l(i+1,j)&4) && lookup_l(i+1,j) != 'R') cast_beam(i+1,j), l[i+1][j]|=4, qM.emplace(i+1,j);
if((~lookup_l(i-1,j)&4) && lookup_l(i-1,j) != 'R') cast_beam(i-1,j), l[i-1][j]|=4, qM.emplace(i-1,j);
if((~lookup_l(i,j+1)&4) && lookup_l(i,j+1) != 'R') cast_beam(i,j+1), l[i][j+1]|=4, qM.emplace(i,j+1);
if((~lookup_l(i,j-1)&4) && lookup_l(i,j-1) != 'R') cast_beam(i,j-1), l[i][j-1]|=4, qM.emplace(i,j-1);
}
// If gozilla is in beam or with mech
if(lookup_l(Gy,Gx))break;
}
// Output answer
cout<<r<<'\n';
}
}
Test details
Test 1
Verdict: WRONG ANSWER
| input |
|---|
| 6 3 3 RR. G.. M.R ... |
| correct output |
|---|
| 1 2 2 21 0 ... |
| user output |
|---|
| 1 2 0 7 0 ... |
Test 2
Verdict: ACCEPTED
| input |
|---|
| 6 3 1000 ... ... ... ... |
| correct output |
|---|
| 0 4 0 1 1 ... |
| user output |
|---|
| 0 4 0 1 1 ... |
Test 3
Verdict: WRONG ANSWER
| input |
|---|
| 5 83 83 ..R....R........R.RRR.R.......... |
| correct output |
|---|
| 0 8 0 1 1 |
| user output |
|---|
| 0 6 0 1 1 |
Test 4
Verdict: WRONG ANSWER
| input |
|---|
| 5 183 183 ..R...R.............R.....R.R.... |
| correct output |
|---|
| 15 5 30 16 0 |
| user output |
|---|
| 11 5 25 16 0 |
Test 5
Verdict: WRONG ANSWER
| input |
|---|
| 5 283 283 ........................RR....... |
| correct output |
|---|
| 0 31 4 2 13 |
| user output |
|---|
| 0 25 2 2 12 |
Test 6
Verdict: WRONG ANSWER
| input |
|---|
| 5 383 383 R.R...R........R...........R.R... |
| correct output |
|---|
| 5 2 68 6 14 |
| user output |
|---|
| 3 2 64 4 14 |
Test 7
Verdict: ACCEPTED
| input |
|---|
| 5 483 483 R.........R...................... |
| correct output |
|---|
| 1 2 7 20 2 |
| user output |
|---|
| 1 2 7 20 2 |
Test 8
Verdict: WRONG ANSWER
| input |
|---|
| 5 583 583 .R...R.....R........R.....R...... |
| correct output |
|---|
| 5 5 86 1 51 |
| user output |
|---|
| 5 5 86 1 49 |
Test 9
Verdict: WRONG ANSWER
| input |
|---|
| 5 683 683 R...............R...R...R........ |
| correct output |
|---|
| 24 136 18 4 12 |
| user output |
|---|
| 24 134 18 4 11 |
Test 10
Verdict: WRONG ANSWER
| input |
|---|
| 5 783 783 ..........R....R....R........R... |
| correct output |
|---|
| 12 18 10 5 4 |
| user output |
|---|
| 9 3 10 3 4 |
Test 11
Verdict: WRONG ANSWER
| input |
|---|
| 5 883 883 ..RR.R........R.R................ |
| correct output |
|---|
| 33 68 58 29 26 |
| user output |
|---|
| 27 67 54 24 25 |
Test 12
Verdict: ACCEPTED
| input |
|---|
| 1 983 983 ...R.R.R.R.....R.R.R.R...R....... |
| correct output |
|---|
| 21 |
| user output |
|---|
| 21 |
Test 13
Verdict: ACCEPTED
| input |
|---|
| 1 1000 1000 ..R...R..R......R..........R..... |
| correct output |
|---|
| 23 |
| user output |
|---|
| 23 |
Test 14
Verdict: ACCEPTED
| input |
|---|
| 2 12 6 ....R.....R. .R........RG .RRRRRRRRRR. ... |
| correct output |
|---|
| 2 0 |
| user output |
|---|
| 2 0 |
