5fed235c32 2020-09-10 kinaba: #include <iostream> 5fed235c32 2020-09-10 kinaba: #include <sstream> 5fed235c32 2020-09-10 kinaba: #include <iomanip> 5fed235c32 2020-09-10 kinaba: #include <vector> 5fed235c32 2020-09-10 kinaba: #include <string> 5fed235c32 2020-09-10 kinaba: #include <map> 5fed235c32 2020-09-10 kinaba: #include <set> 5fed235c32 2020-09-10 kinaba: #include <algorithm> 5fed235c32 2020-09-10 kinaba: #include <numeric> 5fed235c32 2020-09-10 kinaba: #include <iterator> 5fed235c32 2020-09-10 kinaba: #include <functional> 5fed235c32 2020-09-10 kinaba: #include <complex> 5fed235c32 2020-09-10 kinaba: #include <queue> 5fed235c32 2020-09-10 kinaba: #include <stack> 5fed235c32 2020-09-10 kinaba: #include <cmath> 5fed235c32 2020-09-10 kinaba: #include <cassert> 5fed235c32 2020-09-10 kinaba: #include <tuple> 5fed235c32 2020-09-10 kinaba: using namespace std; 5fed235c32 2020-09-10 kinaba: typedef long long LL; 5fed235c32 2020-09-10 kinaba: typedef complex<double> CMP; 5fed235c32 2020-09-10 kinaba: 5fed235c32 2020-09-10 kinaba: class VisitALot { public: 5fed235c32 2020-09-10 kinaba: string travel(int R, int C, vector <int> obsr, vector <int> obsc) 5fed235c32 2020-09-10 kinaba: { 5fed235c32 2020-09-10 kinaba: if (R >= 6) { 5fed235c32 2020-09-10 kinaba: string ans; 5fed235c32 2020-09-10 kinaba: int r = 0, c = 0; 5fed235c32 2020-09-10 kinaba: while (r < R) { 5fed235c32 2020-09-10 kinaba: if (count(obsr.begin(), obsr.end(), r) == 0) { 5fed235c32 2020-09-10 kinaba: if (c == 0) 5fed235c32 2020-09-10 kinaba: while (c + 1 < C) { 5fed235c32 2020-09-10 kinaba: ans += 'E'; 5fed235c32 2020-09-10 kinaba: c++; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: else 5fed235c32 2020-09-10 kinaba: while (c - 1 >= 0) { 5fed235c32 2020-09-10 kinaba: ans += 'W'; 5fed235c32 2020-09-10 kinaba: c--; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: 5fed235c32 2020-09-10 kinaba: if (r + 1 < R) 5fed235c32 2020-09-10 kinaba: ans += 'S'; 5fed235c32 2020-09-10 kinaba: r++; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: return ans; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: 5fed235c32 2020-09-10 kinaba: if (C >= 6) { 5fed235c32 2020-09-10 kinaba: string ans; 5fed235c32 2020-09-10 kinaba: int r = 0, c = 0; 5fed235c32 2020-09-10 kinaba: while (c < C) { 5fed235c32 2020-09-10 kinaba: if (count(obsc.begin(), obsc.end(), c) == 0) { 5fed235c32 2020-09-10 kinaba: if (r == 0) 5fed235c32 2020-09-10 kinaba: while (r + 1 < R) { 5fed235c32 2020-09-10 kinaba: ans += 'S'; 5fed235c32 2020-09-10 kinaba: r++; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: else 5fed235c32 2020-09-10 kinaba: while (r - 1 >= 0) { 5fed235c32 2020-09-10 kinaba: ans += 'N'; 5fed235c32 2020-09-10 kinaba: r--; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: 5fed235c32 2020-09-10 kinaba: if (c + 1 < C) 5fed235c32 2020-09-10 kinaba: ans += 'E'; 5fed235c32 2020-09-10 kinaba: c++; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: return ans; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: 5fed235c32 2020-09-10 kinaba: // naive search 5fed235c32 2020-09-10 kinaba: vector<vector<bool>> visited(R, vector<bool>(C)); 5fed235c32 2020-09-10 kinaba: for (int i = 0; i < obsr.size(); ++i) 5fed235c32 2020-09-10 kinaba: visited[obsr[i]][obsc[i]] = true; 5fed235c32 2020-09-10 kinaba: visited[0][0] = true; 5fed235c32 2020-09-10 kinaba: string ans; 5fed235c32 2020-09-10 kinaba: dfs(ans, R, C, 0, 0, visited); 5fed235c32 2020-09-10 kinaba: return ans; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: 5fed235c32 2020-09-10 kinaba: bool dfs(string& s, int R, int C, int r, int c, vector<vector<bool>>& visited) { 5fed235c32 2020-09-10 kinaba: int dr[] = { -1,+1,0,0 }; 5fed235c32 2020-09-10 kinaba: int dc[] = { 0,0,-1,+1 }; 5fed235c32 2020-09-10 kinaba: char dd[] = { 'N', 'S', 'W', 'E' }; 5fed235c32 2020-09-10 kinaba: for (int i = 0; i < 4; ++i) { 5fed235c32 2020-09-10 kinaba: int rr = r + dr[i]; 5fed235c32 2020-09-10 kinaba: int cc = c + dc[i]; 5fed235c32 2020-09-10 kinaba: if (0 <= rr && rr < R && 0 <= cc && cc < C && !visited[rr][cc]) { 5fed235c32 2020-09-10 kinaba: visited[rr][cc] = true; 5fed235c32 2020-09-10 kinaba: s += dd[i]; 5fed235c32 2020-09-10 kinaba: if (s.size()+1 >= (R*C+1)/2 || dfs(s, R, C, rr, cc, visited)) 5fed235c32 2020-09-10 kinaba: return true; 5fed235c32 2020-09-10 kinaba: s.resize(s.size() - 1); 5fed235c32 2020-09-10 kinaba: visited[rr][cc] = false; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: return false; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: }; 5fed235c32 2020-09-10 kinaba: 5fed235c32 2020-09-10 kinaba: // BEGIN CUT HERE 5fed235c32 2020-09-10 kinaba: #include <ctime> 5fed235c32 2020-09-10 kinaba: double start_time; string timer() 5fed235c32 2020-09-10 kinaba: { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } 5fed235c32 2020-09-10 kinaba: template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) 5fed235c32 2020-09-10 kinaba: { os << "{ "; 5fed235c32 2020-09-10 kinaba: for(typename vector<T>::const_iterator it=v.begin(); it!=v.end(); ++it) 5fed235c32 2020-09-10 kinaba: os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } 5fed235c32 2020-09-10 kinaba: void verify_case(const string& Expected, const string& Received) { 5fed235c32 2020-09-10 kinaba: bool ok = (Expected == Received); 5fed235c32 2020-09-10 kinaba: if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; 5fed235c32 2020-09-10 kinaba: cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } } 5fed235c32 2020-09-10 kinaba: #define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); 5fed235c32 2020-09-10 kinaba: #define END verify_case(_, VisitALot().travel(R, C, obsr, obsc));} 5fed235c32 2020-09-10 kinaba: int main(){ 5fed235c32 2020-09-10 kinaba: 5fed235c32 2020-09-10 kinaba: CASE(0) 5fed235c32 2020-09-10 kinaba: int R = 2; 5fed235c32 2020-09-10 kinaba: int C = 3; 5fed235c32 2020-09-10 kinaba: vector <int> obsr; 5fed235c32 2020-09-10 kinaba: vector <int> obsc; 5fed235c32 2020-09-10 kinaba: string _ = "SENE"; 5fed235c32 2020-09-10 kinaba: END 5fed235c32 2020-09-10 kinaba: CASE(1) 5fed235c32 2020-09-10 kinaba: int R = 6; 5fed235c32 2020-09-10 kinaba: int C = 5; 5fed235c32 2020-09-10 kinaba: int obsr_[] = {1, 1, 4}; 5fed235c32 2020-09-10 kinaba: vector <int> obsr(obsr_, obsr_+sizeof(obsr_)/sizeof(*obsr_)); 5fed235c32 2020-09-10 kinaba: int obsc_[] = {1, 3, 1}; 5fed235c32 2020-09-10 kinaba: vector <int> obsc(obsc_, obsc_+sizeof(obsc_)/sizeof(*obsc_)); 5fed235c32 2020-09-10 kinaba: string _ = "SSEESWWSSEENEE"; 5fed235c32 2020-09-10 kinaba: END 5fed235c32 2020-09-10 kinaba: CASE(2) 5fed235c32 2020-09-10 kinaba: int R = 7; 5fed235c32 2020-09-10 kinaba: int C = 8; 5fed235c32 2020-09-10 kinaba: vector <int> obsr; 5fed235c32 2020-09-10 kinaba: vector <int> obsc; 5fed235c32 2020-09-10 kinaba: string _ = "EEEEEEESWWWWWWWSEEEEEEESWWWWWWWSEEEEEEESWWWWWWWSEEEEEEE"; 5fed235c32 2020-09-10 kinaba: END 5fed235c32 2020-09-10 kinaba: CASE(3) 5fed235c32 2020-09-10 kinaba: int R = 7; 5fed235c32 2020-09-10 kinaba: int C = 4; 5fed235c32 2020-09-10 kinaba: int obsr_[] = { 5,2,1 }; 5fed235c32 2020-09-10 kinaba: vector <int> obsr(obsr_, obsr_+sizeof(obsr_)/sizeof(*obsr_)); 5fed235c32 2020-09-10 kinaba: int obsc_[] = { 1,2,2 }; 5fed235c32 2020-09-10 kinaba: vector <int> obsc(obsc_, obsc_+sizeof(obsc_)/sizeof(*obsc_)); 5fed235c32 2020-09-10 kinaba: string _ = "?"; 5fed235c32 2020-09-10 kinaba: END 5fed235c32 2020-09-10 kinaba: CASE(4) 5fed235c32 2020-09-10 kinaba: int R = 50; 5fed235c32 2020-09-10 kinaba: int C = 50; 5fed235c32 2020-09-10 kinaba: int obsr_[] = { 1,10,15 }; 5fed235c32 2020-09-10 kinaba: vector <int> obsr(obsr_, obsr_+sizeof(obsr_)/sizeof(*obsr_)); 5fed235c32 2020-09-10 kinaba: int obsc_[] = { 28, 17, 3 }; 5fed235c32 2020-09-10 kinaba: vector <int> obsc(obsc_, obsc_+sizeof(obsc_)/sizeof(*obsc_)); 5fed235c32 2020-09-10 kinaba: string _ = "?"; 5fed235c32 2020-09-10 kinaba: END 5fed235c32 2020-09-10 kinaba: CASE(4) 5fed235c32 2020-09-10 kinaba: int R = 5; 5fed235c32 2020-09-10 kinaba: int C = 5; 5fed235c32 2020-09-10 kinaba: int obsr_[] = { 1,2,3 }; 5fed235c32 2020-09-10 kinaba: vector <int> obsr(obsr_, obsr_ + sizeof(obsr_) / sizeof(*obsr_)); 5fed235c32 2020-09-10 kinaba: int obsc_[] = { 1,2,3 }; 5fed235c32 2020-09-10 kinaba: vector <int> obsc(obsc_, obsc_ + sizeof(obsc_) / sizeof(*obsc_)); 5fed235c32 2020-09-10 kinaba: string _ = "?"; 5fed235c32 2020-09-10 kinaba: END 5fed235c32 2020-09-10 kinaba: CASE(4) 5fed235c32 2020-09-10 kinaba: int R = 4; 5fed235c32 2020-09-10 kinaba: int C = 4; 5fed235c32 2020-09-10 kinaba: int obsr_[] = { 1,2 }; 5fed235c32 2020-09-10 kinaba: vector <int> obsr(obsr_, obsr_ + sizeof(obsr_) / sizeof(*obsr_)); 5fed235c32 2020-09-10 kinaba: int obsc_[] = { 1,2 }; 5fed235c32 2020-09-10 kinaba: vector <int> obsc(obsc_, obsc_ + sizeof(obsc_) / sizeof(*obsc_)); 5fed235c32 2020-09-10 kinaba: string _ = "?"; 5fed235c32 2020-09-10 kinaba: END 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: // END CUT HERE