結果

問題 No.331 CodeRunnerでやれ
ユーザー naimonon77naimonon77
提出日時 2016-02-27 11:42:31
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 358 ms / 5,000 ms
コード長 4,568 bytes
コンパイル時間 1,193 ms
コンパイル使用メモリ 156,448 KB
実行使用メモリ 41,884 KB
平均クエリ数 321.41
最終ジャッジ日時 2023-09-23 23:16:35
合計ジャッジ時間 6,529 ms
ジャッジサーバーID
(参考情報)
judge14 / judge11
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 136 ms
24,324 KB
testcase_01 AC 132 ms
24,036 KB
testcase_02 AC 163 ms
23,548 KB
testcase_03 AC 165 ms
23,536 KB
testcase_04 AC 185 ms
24,324 KB
testcase_05 AC 167 ms
23,556 KB
testcase_06 AC 215 ms
41,884 KB
testcase_07 AC 278 ms
23,536 KB
testcase_08 AC 177 ms
24,424 KB
testcase_09 AC 256 ms
23,836 KB
testcase_10 AC 206 ms
23,560 KB
testcase_11 AC 196 ms
23,856 KB
testcase_12 AC 210 ms
23,548 KB
testcase_13 AC 241 ms
23,364 KB
testcase_14 AC 358 ms
37,892 KB
testcase_15 AC 244 ms
23,536 KB
testcase_16 AC 295 ms
23,844 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#define _CRT_SECURE_NO_WARNINGS
#define _USE_MATH_DEFINES

#ifdef __unix__
#include <bits/stdc++.h>
#else
#include "bits\stdc++.h"
#endif
#include <vector>
#include <set>
#include <string>
#include <queue>
#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;

#define SIZE 50

enum Muki{
  up,r,down,l
};

bool test = 0;

void draw_map(char map[][SIZE],int a,int x, int y,int muki) {
  int i;
  for(i=1;i<a+1;i++) {
    switch(muki) {
    case  up  : map[ x ][y+i] = '.'; break;
    case down : map[ x ][y-i] = '.'; break;
    case   r  : map[x+i][ y ] = '.'; break;
    case   l  : map[x-i][ y ] = '.'; break;
    }
  }
  switch(muki) {
  case  up  : map[ x ][y+i] = '#'; break;
  case down : map[ x ][y-i] = '#'; break;
  case   r  : map[x+i][ y ] = '#'; break;
  case   l  : map[x-i][ y ] = '#'; break;
  }
  // 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("");
  }
}

class Route1{
public:
  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 muki) {
  char c;
  switch(muki) {
  case  up : c = '^'; break;
  case down: c = 'v'; break;
  case  r  : c = '>'; break;
  case  l  : c = '<'; break;
  default : puts("エラー"); exit(1);
  }
  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;
    }
    if( map_search(map,x-1, y ,q,now) ) {
      q.back().route.push_back(l);
      if(test) chackq(q.front());
    }
    if( map_search(map,x+1, y ,q,now) ) {
      q.back().route.push_back(r);
      if(test) chackq(q.front());
    }
    if( map_search(map, x ,y-1,q,now) ) {
      q.back().route.push_back(down);
      if(test) chackq(q.front());
    }
    if( map_search(map, x ,y+1,q,now) ) {
      q.back().route.push_back(up);
      if(test) chackq(q.front());
    }
  }
  exit(1);
}

void player_move(int muki,int& x,int& y,
  char map[][SIZE]) 
{
  map[x][y] = '.';
  switch(muki) {
  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 muki,int& x,int& y,
  char map[][SIZE]) 
{
  switch(muki) {
  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);
  */
  bool test = 0;
  char map[SIZE][SIZE] = {0};  // 0 or '.' or '#'
  int x = SIZE/2 ,y = SIZE/2;
  int muki = down;
  char s[20];
  Route1 route1;
  route1.index = 0;
  muki_draw(muki,x,y,map);
  if(test) print_map(map);
  while(cin >> s) {
    char c;
    if(strcmp(s,"Merry") == 0)  break;
    int a = atoi(s);
    if(a > 50) {
      c = 'F';
      player_move(muki,x,y,map);
    }
    else {
      draw_map(map,a,x,y,muki);
      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] == muki) {
        player_move(muki,x,y,map);
        c = 'F';
        index++;
      }
      else {
        c = 'L';
        muki--;
        if(muki < up) muki = l;
        muki_draw(muki,x,y,map);
      }
    }
    if(test) print_map(map);
    cout << c << endl;
  }
  cin >> s;
  return 0;
}
0