close

題目連結:   https://onlinejudge.org/external/118/11831.pdf

題目大意:  給你一個地圖,有4個方向,3個指令(D向右轉,E向左轉,F前進),#不能走,要蒐集*,問能蒐集幾個*。

思路:  單純模擬題,邊界判斷障礙物判斷,走迷宮的題型做多了,就會把方向走法紀錄到陣列裡。我這邊x走row,y走col。

用一個變數表示現在方位。這樣方便code,轉向直接++或--就好。

代碼:  

#include <bits/stdc++.h>
using namespace std;

int dir;
int walk[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
int setdir(char c){
    if(c == 'N') return 0;
    if(c == 'L') return 1;
    if(c == 'S') return 2;
    return 3;
}
void turn(char c){
    if(c == 'D') dir++;
    if(c == 'E') dir--;
    dir = (dir+4)%4;
}

int main()
{
    //freopen("out.txt", "w", stdout);
    int n, m, s;
    char g[105][105];
    while(cin >> n >> m >> s, n+m+s){
        int x = 0, y = 0;
        for(int i = 0; i < n; ++i){
            for(int j = 0; j < m; ++j){
                cin >> g[i][j];
                if(g[i][j] != '.' && g[i][j] != '*' && g[i][j] != '#')
                    x = i, y = j, dir = setdir(g[i][j]), g[i][j] = '.';
            }
        }
        int ans = 0;
        char c;
        int ny, nx;
        for(int i = 0; i < s ; ++i){
            cin >> c;
            if(c == 'F'){
                nx = x+walk[dir][0], ny = y+walk[dir][1];
                if(nx < 0 || nx >= n || ny < 0 || ny >= m || g[nx][ny] == '#') continue;
                if(g[nx][ny] == '*'){
                    ans++;
                    g[nx][ny] = '.';
                }
                x = nx, y = ny;
            }
            else{
                turn(c);
            }
        }
        cout << ans << "\n";
    }
    return 0;
}

arrow
arrow
    創作者介紹
    創作者 尾玉 的頭像
    尾玉

    louisfghbvc的部落格

    尾玉 發表在 痞客邦 留言(0) 人氣()