【 OJ 】 HDOJ1035 18年11月17日14:15 [ 32 ]
阿新 • • 發佈:2018-11-19
本題也沒啥說的....按照題目模擬就行了,讀取到啥就怎麼走,遇到邊界或者迴圈就出,用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; }