1. 程式人生 > >【 OJ 】 HDOJ1035 18年11月17日14:15 [ 32 ]

【 OJ 】 HDOJ1035 18年11月17日14:15 [ 32 ]

本題也沒啥說的....按照題目模擬就行了,讀取到啥就怎麼走,遇到邊界或者迴圈就出,用visit記錄訪問過的點,然後讀取的每一個點都入棧(可用陣列來模擬),如果突然讀取到了已經訪問過的點說明進入了迴圈,就去陣列棧中找這個重複點,之前點數目為未迴圈步數,之後點數目為迴圈數目。

AC程式碼:

#include <iostream>
using namespace std;
char map[100][100];//地圖大小開100
bool visit[100][100];
char d[4] = { 'E','S','W','N' };
int dri[4][2] = { { 0,1 },{ 1, 0 },{ 0, -1 },{ -1, 0 } };
struct p{
    int x;
    int y;
}cp;
p stack[100];
int main(void) {
    int r,c, s;
    cin >> r >> c >> s;
    int i, j,index;
    int step = 0;
    while (c || r) {
        index = step = 0;
        memset(visit, 0, sizeof(visit));
        for (i = 0; i < r; i++) {
            for (j = 0; j < c; ++j) {
                cin >> map[i][j];
            }
        }//錄入地圖資訊
        if (s > c)
            continue;//越界
        //按題目模擬
        cp.x = 0; cp.y = s - 1;
        while (((cp.x >= 0 && cp.x < r) && (cp.y >= 0 && cp.y < c)) && !visit[cp.x][cp.y]) {//在範圍內並且為被訪問
            stack[index++] = cp;
            visit[cp.x][cp.y] = 1;
            for (i = 0; i < 4; i++) {
                if (map[cp.x][cp.y] == d[i]) {
                    cp.x += dri[i][0];
                    cp.y += dri[i][1];
                    break;
                }//方向轉變
            }
        }//出來有2種情況 1 越界  2 迴圈
        if (cp.x >= 0 && cp.x < r&&cp.y >= 0 && cp.y < c) {//在範圍內就是迴圈
            for (i = 0; i < index; ++i) {
                if (stack[i].x == cp.x&&stack[i].y == cp.y) {
                    step = i ;
                    break;
                }
            }//找出迴圈step
            cout << step << " step(s) before a loop of " << index - step << " step(s)" << endl;
        }
        else {//迴圈
            step = index;
            cout << step << " step(s) to exit" << endl;
        }
        cin >> r >> c >> s;
    }
    system("pause");
    return 0;
}