Codeforces #192 Div1 D The Evil Temple and the Moving Rocks

概要

石が動いていく、動くと止まったときに音が鳴る こどふぉのサイト見てください

回答

たぶん123779回鳴る回答です。通りました

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.v
^<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
v.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>^

を25ループ,開始地点は(1,1)
このループは、2列*2で成り立ってて、2列目と3列目の間についてほぼ鏡写しのようになっています
1列目と2列目でぐるぐる回ります。
3列目と4列目でぐるぐる回ります。
5列目と6列目でぐるぐr

検証用プログラム

#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <typeinfo>
#include <queue>

using namespace std;
typedef long long ll;
typedef pair<int, int> P;
typedef pair<P, int> Q;

const int N = 100;
int main(int argc, char *argv[]) {
    char b[N+1][N+1];
    for (int i = 0; i < 100; i++) {
        cin >> b[i];
    }
    cout << "OK" << endl;
    int x, y;
    cin >> x >> y;
    x--;
    y--;
    int result = 0;
    int c;
    for (c = 0; c < 1e7; c++) {
        bool flag = false;
        int i;
        switch (b[x][y]) {
            case 'v':
                for (i = x+1; i < N; i++) {
                    if (b[i][y] != '.') {
                        flag = true;
                        break;
                    }
                }
                if (flag) {
                    if (i-x>1) result++;
                    b[x][y] = '.';
                    b[i-1][y] = 'v';
                    x = i;
                }
                break;
            case '>':
                for (i = y+1; i < N; i++) {
                    if (b[x][i] != '.') {
                        flag = true;
                        break;
                    }
                }
                if (flag) {
                    if (i-y>1) result++;
                    b[x][y] = '.';
                    b[x][i-1] = '>';
                    y = i;
                }
                break;
            case '^':
                for (i = x-1; i >= 0; i--) {
                    if (b[i][y] != '.') {
                        flag = true;
                        break;
                    }
                }
                if (flag) {
                    if (x-i>1) result++;
                    b[x][y] = '.';
                    b[i+1][y] = '^';
                    x = i;
                }
                break;
            case '<':
                for (i = y-1; i >= 0; i--) {
                    if (b[x][i] != '.') {
                        flag = true;
                        break;
                    }
                }
                if (flag) {
                    if (y-i>1) result++;
                    b[x][y] = '.';
                    b[x][i+1] = '<';
                    y = i;
                }
                break;
        }
        if (!flag) {
            break;
        }
    }
    printf("%d %d\n", result, c);
    return 0;
}