結果
| 問題 | No.331 CodeRunnerでやれ |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2016-10-09 21:38:59 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
TLE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 4,347 bytes |
| 記録 | |
| コンパイル時間 | 1,908 ms |
| コンパイル使用メモリ | 180,440 KB |
| 実行使用メモリ | 97,104 KB |
| 平均クエリ数 | 6.59 |
| 最終ジャッジ日時 | 2024-07-17 00:28:28 |
| 合計ジャッジ時間 | 10,094 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 2 TLE * 1 -- * 13 |
ソースコード
#define _CRT_SECURE_NO_WARNINGS
#define _USE_MATH_DEFINES
#include "bits/stdc++.h"
#define REP(i,a,b) for(int i=a;i<b;++i)
#define rep(i,n) REP(i,0,n)
#define ll long long
#define ull unsigned ll
typedef long double ld;
#define ALL(a) begin(a),end(a)
#define ifnot(a) if(not (a))
#define dump(x) cerr << #x << " = " << (x) << endl
using namespace std;
// #define int ll
#ifdef _MSC_VER
const bool test = true;
#else
const bool test = false;
#endif
int dx[] = { 0,1,0,-1 };
int dy[] = { 1,0,-1,0 };
#define INF (1 << 28)
ull mod = (int)1e9 + 7;
//.....................
#define MAX (int)1e5 + 5
#define SIZE 20
enum Dir {
up, r, down, l
};
void draw_map(char map[][SIZE], int a, int x, int y, int dir) {
int i;
for (i = 1; i < a + 1; i++) {
switch (dir) {
case up: y += 1; break;
case down: y -= 1; break;
case r: x += 1; break;
case l: x -= 1; break;
}
map[x][y] = '.';
}
switch (dir) {
case up: y += 1; break;
case down: y -= 1; break;
case r: x += 1; break;
case l: x -= 1; break;
}
map[x][y] = '#';
// map[x][y] = '!';
}
void print_map(char map[][SIZE]) {
int i, j;
for (i = SIZE - 1; i>-1; i--) {
for (j = 0; j<SIZE; j++) {
if (map[j][i] == 0) printf(" ");
else printf("%c", map[j][i]);
}
puts("");
}
}
struct Route1 {
vector<int> route;
bool visited[SIZE][SIZE];
int x, y;
int index;
Route1() {
int i, j;
rep(i, SIZE) {
rep(j, SIZE) visited[i][j] = false;
}
}
};
char muki_convert(int dir) {
char c;
switch (dir) {
case up: c = '^'; break;
case down: c = 'v'; break;
case r: c = '>'; break;
case l: c = '<'; break;
default: assert(false);
}
return c;
}
void chackq(Route1 route1) {
int i;
rep(i, route1.route.size()) {
cout << muki_convert(route1.route[i]);
}
puts("");
}
bool map_search(char map[][SIZE],
int x, int y, queue<Route1>& q, const Route1& now)
{
if ((not now.visited[x][y]) && map[x][y] != '#') {
Route1 next = now;
next.x = x, next.y = y;
next.visited[x][y] = true;
q.push(next);
return true;
}
return false;
}
// 最も近い分からない場所を探索
// 最後は行けるか分からない
Route1 wfs(char map[][SIZE], int x, int y) {
queue< Route1 > q;
Route1 now;
now.x = x; now.y = y;
now.index = 0;
now.visited[x][y] = true;
q.push(now);
while (q.size()) {
now = q.front(); q.pop();
int x = now.x, y = now.y;
if (test) printf("map[%d][%d] = %c", x, y, map[x][y]);
if (test) puts("");
if (map[x][y] == 0) {
return now;
}
rep(i, 4) {
int nx = x + dx[i];
int ny = y + dy[i];
if (map_search(map, nx, ny, q, now)) {
q.back().route.push_back(i);
if (test) chackq(q.front());
}
}
}
exit(1);
}
void player_move(int dir, int& x, int& y,
char map[][SIZE])
{
map[x][y] = '.';
switch (dir) {
case up: y++; map[x][y] = '^'; break;
case down: y--; map[x][y] = 'v'; break;
case r: x++; map[x][y] = '>'; break;
case l: x--; map[x][y] = '<'; break;
}
}
void muki_draw(int dir, int& x, int& y,
char map[][SIZE])
{
switch (dir) {
case up: map[x][y] = '^'; break;
case down: map[x][y] = 'v'; break;
case r: map[x][y] = '>'; break;
case l: map[x][y] = '<'; break;
}
}
int main() {
/*
cin.tie(0);
ios::sync_with_stdio(false);
*/
char map[SIZE][SIZE] = { 0 }; // 0 or '.' or '#'
int x = SIZE / 2, y = SIZE / 2;
int dir = down;
string s;
Route1 route1;
route1.index = 0;
muki_draw(dir, x, y, map);
if (test) print_map(map);
while (cin >> s) {
char c;
if (s == "Merry") break;
int a = stoi(s);
if (a > 50) {
c = 'F';
player_move(dir, x, y, map);
}
else {
draw_map(map, a, x, y, dir);
int& index = route1.index;
if (a == 0 or route1.route.size() == index) {
route1 = wfs(map, x, y);
if (test) {
int i;
REP(i, index, route1.route.size()) {
cout << muki_convert(route1.route[i]);
}
puts("");
}
}
if (a != 0 && route1.route[index] == dir) {
player_move(dir, x, y, map);
c = 'F';
index++;
}
else {
int next_dir = route1.route[index];
dump(dir);
dump(next_dir);
if ((dir - next_dir + 4) % 4 < 3) {
c = 'L';
dir--;
if (dir < up) dir = l;
}
else {
c = 'R';
dir++;
if (dir > l) dir = 0;
}
muki_draw(dir, x, y, map);
}
}
if (test) print_map(map);
cout << c << endl;
}
cin >> s;
return 0;
}