Created
December 24, 2017 11:11
-
-
Save shelaf/4709c8c1363aa45f6ee91243375207ec to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <bits/stdc++.h> | |
#include <sys/time.h> | |
using namespace std; | |
#define rep(i,n) for(long long i = 0; i < (long long)(n); i++) | |
#define repi(i,a,b) for(long long i = (long long)(a); i < (long long)(b); i++) | |
#define pb push_back | |
#define all(x) (x).begin(), (x).end() | |
#define fi first | |
#define se second | |
#define mt make_tuple | |
#define mp make_pair | |
#define ZERO(a) memset(a,0,sizeof(a)) | |
template<class T1, class T2> bool chmin(T1 &a, T2 b) { return b < a && (a = b, true); } | |
template<class T1, class T2> bool chmax(T1 &a, T2 b) { return a < b && (a = b, true); } | |
#define exists find_if | |
#define forall all_of | |
using ll = long long; using vll = vector<ll>; using vvll = vector<vll>; using P = pair<ll, ll>; | |
using ld = long double; using vld = vector<ld>; | |
using vi = vector<int>; using vvi = vector<vi>; vll conv(vi& v) { vll r(v.size()); rep(i, v.size()) r[i] = v[i]; return r; } | |
inline void input(int &v){ v=0;char c=0;int p=1; while(c<'0' || c>'9'){if(c=='-')p=-1;c=getchar();} while(c>='0' && c<='9'){v=(v<<3)+(v<<1)+c-'0';c=getchar();} v*=p; } | |
template <typename T, typename U> ostream &operator<<(ostream &o, const pair<T, U> &v) { o << "(" << v.first << ", " << v.second << ")"; return o; } | |
template<size_t...> struct seq{}; template<size_t N, size_t... Is> struct gen_seq : gen_seq<N-1, N-1, Is...>{}; template<size_t... Is> struct gen_seq<0, Is...> : seq<Is...>{}; | |
template<class Ch, class Tr, class Tuple, size_t... Is> | |
void print_tuple(basic_ostream<Ch,Tr>& os, Tuple const& t, seq<Is...>){ using s = int[]; (void)s{0, (void(os << (Is == 0? "" : ", ") << get<Is>(t)), 0)...}; } | |
template<class Ch, class Tr, class... Args> | |
auto operator<<(basic_ostream<Ch, Tr>& os, tuple<Args...> const& t) -> basic_ostream<Ch, Tr>& { os << "("; print_tuple(os, t, gen_seq<sizeof...(Args)>()); return os << ")"; } | |
ostream &operator<<(ostream &o, const vvll &v) { rep(i, v.size()) { rep(j, v[i].size()) o << v[i][j] << " "; o << endl; } return o; } | |
template <typename T> ostream &operator<<(ostream &o, const vector<T> &v) { o << '['; rep(i, v.size()) o << v[i] << (i != v.size()-1 ? ", " : ""); o << "]"; return o; } | |
template <typename T> ostream &operator<<(ostream &o, const set<T> &m) { o << '['; for (auto it = m.begin(); it != m.end(); it++) o << *it << (next(it) != m.end() ? ", " : ""); o << "]"; return o; } | |
template <typename T> ostream &operator<<(ostream &o, const unordered_set<T> &m) { o << '['; for (auto it = m.begin(); it != m.end(); it++) o << *it << (next(it) != m.end() ? ", " : ""); o << "]"; return o; } | |
template <typename T, typename U> ostream &operator<<(ostream &o, const map<T, U> &m) { o << '['; for (auto it = m.begin(); it != m.end(); it++) o << *it << (next(it) != m.end() ? ", " : ""); o << "]"; return o; } | |
template <typename T, typename U, typename V> ostream &operator<<(ostream &o, const unordered_map<T, U, V> &m) { o << '['; for (auto it = m.begin(); it != m.end(); it++) o << *it; o << "]"; return o; } | |
vector<int> range(const int x, const int y) { vector<int> v(y - x + 1); iota(v.begin(), v.end(), x); return v; } | |
template <typename T> istream& operator>>(istream& i, vector<T>& o) { rep(j, o.size()) i >> o[j]; return i;} | |
string bits_to_string(ll input, ll n=64) { string s; rep(i, n) s += '0' + !!(input & (1ll << i)); reverse(all(s)); return s; } | |
template <typename T> ostream &operator<<(ostream &o, const priority_queue<T> &v) { auto tmp = v; while (tmp.size()) { auto x = tmp.top(); tmp.pop(); o << x << " ";} o << endl; return o; } | |
template <typename T> unordered_map<T, ll> counter(vector<T> vec){unordered_map<T, ll> ret; for (auto&& x : vec) ret[x]++; return ret;}; | |
string substr(string s, P x) {return s.substr(x.fi, x.se - x.fi); } | |
void vizGraph(vvll& g, int mode = 0, string filename = "out.png") { ofstream ofs("./out.dot"); ofs << "digraph graph_name {" << endl; set<P> memo; rep(i, g.size()) rep(j, g[i].size()) { if (mode && (memo.count(P(i, g[i][j])) || memo.count(P(g[i][j], i)))) continue; memo.insert(P(i, g[i][j])); ofs << " " << i << " -> " << g[i][j] << (mode ? " [arrowhead = none]" : "")<< endl; } ofs << "}" << endl; ofs.close(); system(((string)"dot -T png out.dot >" + filename).c_str()); } | |
size_t random_seed; namespace std { using argument_type = P; template<> struct hash<argument_type> { size_t operator()(argument_type const& x) const { size_t seed = random_seed; seed ^= hash<ll>{}(x.fi); seed ^= (hash<ll>{}(x.se) << 1); return seed; } }; }; // hash for various class | |
namespace myhash{ const int Bsizes[]={3,9,13,17,21,25,29,33,37,41,45,49,53,57,61,65,69,73,77,81}; const int xor_nums[]={0x100007d1,0x5ff049c9,0x14560859,0x07087fef,0x3e277d49,0x4dba1f17,0x709c5988,0x05904258,0x1aa71872,0x238819b3,0x7b002bb7,0x1cf91302,0x0012290a,0x1083576b,0x76473e49,0x3d86295b,0x20536814,0x08634f4d,0x115405e8,0x0e6359f2}; const int hash_key=xor_nums[rand()%20]; const int mod_key=xor_nums[rand()%20]; template <typename T> struct myhash{ std::size_t operator()(const T& val) const { return (hash<T>{}(val)%mod_key)^hash_key; } }; }; | |
template <typename T> class uset:public std::unordered_set<T,myhash::myhash<T>> { using SET=std::unordered_set<T,myhash::myhash<T>>; public: uset():SET(){SET::rehash(myhash::Bsizes[rand()%20]);} }; | |
uint32_t randxor() { static uint32_t x=1+(uint32_t)random_seed,y=362436069,z=521288629,w=88675123; uint32_t t; t=(x^(x<<11));x=y;y=z;z=w; return( w=(w^(w>>19))^(t^(t>>8)) ); } | |
struct timeval start; double sec() { struct timeval tv; gettimeofday(&tv, NULL); return (tv.tv_sec - start.tv_sec) + (tv.tv_usec - start.tv_usec) * 1e-6; } | |
struct init_{init_(){ gettimeofday(&start, NULL); ios::sync_with_stdio(false); cin.tie(0); struct timeval myTime; struct tm *time_st; gettimeofday(&myTime, NULL); time_st = localtime(&myTime.tv_sec); srand(myTime.tv_usec); random_seed = RAND_MAX / 2 + rand() / 2; }} init__; | |
#define rand randxor | |
static const double EPS = 1e-14; | |
static const long long INF = 1e18; | |
static const long long mo = 1e9+7; | |
#define ldout fixed << setprecision(40) | |
const ll mx = 10, my = 10; | |
vector<string> b = { | |
"xooxxooxxo", | |
"osodxxxxxx", | |
"xxxooxoxoo", | |
"odxxoxoxox", | |
"xooxxxxdox", | |
"oxoxxoxoxo", | |
"xdxxxoxxxo", | |
"xoxooxoxxx", | |
"xoxxxooxgo", | |
"xxooxxxoxx", | |
}; | |
ll sx = 1, sy = 1; | |
typedef struct _state_t { | |
double score = 0; | |
ll hp = 0; | |
ll x = 0, y = 0; | |
bool used[10][10] = {}; | |
string s; | |
bool operator<(const _state_t& right) const { | |
return score < right.score; | |
} | |
} state_t; | |
ostream& operator<<(ostream &o, const state_t& s) { | |
o << "hp: " << s.hp << ", " << "score: " << s.score << " " << P(s.x, s.y) << " " << s.s; | |
return o; | |
} | |
double getScore(state_t s) { | |
return s.hp; | |
} | |
vector<state_t> getNext(state_t s) { | |
vector<state_t> ret; | |
vll dx = {1,0,-1,0}; | |
vll dy = {0,1,0,-1}; | |
string ds = "DRUL"; | |
rep(d, 4) { | |
auto next_s = s; | |
next_s.x += dx[d]; if (next_s.x >= mx || next_s.x < 0) continue; | |
next_s.y += dy[d]; if (next_s.y >= my || next_s.y < 0) continue; | |
if (next_s.used[next_s.x][next_s.y]) continue; | |
next_s.used[next_s.x][next_s.y] = 1; | |
if (b[next_s.x][next_s.y] == 'o') | |
next_s.hp++; | |
else if (b[next_s.x][next_s.y] == 'x') | |
next_s.hp--; | |
next_s.s += ds[d]; | |
next_s.score = getScore(next_s); | |
ret.pb(next_s); | |
} | |
return ret; | |
} | |
int main(void) { | |
state_t init_s; | |
init_s.x = sx, init_s.y = sy, init_s.used[sx][sy] = 1, init_s.hp = 36; | |
priority_queue<state_t> now, next; | |
now.push(init_s); | |
cout << getNext(init_s)<<endl; | |
ll beam = 1000000; | |
rep(t, 1000) { | |
cout << t + 1 << endl; | |
rep(i, beam) { | |
if (now.size() == 0) break; | |
auto s = now.top(); now.pop(); | |
for (auto next_s : getNext(s)) { | |
if (b[next_s.x][next_s.y] == 'd') continue; | |
if (b[next_s.x][next_s.y] == 'g') { | |
if (next_s.hp >= 50) { | |
cout << "HIT" << endl; | |
cout << next_s.s.size() << "steps: " << next_s << endl; | |
// return 0; | |
} else { | |
continue; | |
} | |
} | |
next.push(next_s); | |
} | |
} | |
if (next.size()) | |
cout << next.top() << endl; | |
now = priority_queue<state_t>(); | |
swap(now, next); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment