# Mutant Flatworld Explorers(UVA118)
## [程式繳交區](https://hackmd.io/@Renektonn/BJwTgeytkg/edit)
## 題目
[點我](https://onlinejudge.org/external/1/118.pdf)
## 解題系統
[UVA](https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=54)
[ZJ](https://zerojudge.tw/ShowProblem?problemid=c082)
## 演算法
```
1. 輸入右上角頂點座標maxX, maxY
2. 定義一個布林陣列isLost[0~maxX][0~maxY]={},再定義方向陣列dy,dx(北東南西)
3. 輸入posX,posY,dir(將dir轉為數字),若無法,則停止
4. 輸入ins,定義flag = 1
5. 掃過ins,對於每一個c=ins[i],判斷它是'L','R','F'哪個
若是'L',dir=dir - 1,若dir<0,dir += 4
若是'R',dir=dir + 1,若dir>=4,dir-=4
若是'F'
如果移動後會掉下去
如果當前位置已經有人掉下去過
跳過
否則
在當前位置做標記
輸出posX posY dir(轉回真正的方向) LOST
flag = 0
break
否則
移動
6. 若flag=1,輸出posX posY dir(轉回真正的方向)
```
## 程式碼
```cpp=
#include <bits/stdc++.h>
#define int long long int
using namespace std;
int maxX, maxY;
int isValid (int x, int y) {
return 0 <= x and x <= maxX and 0 <= y and y <= maxY;
}
signed main() {
cin >> maxX >> maxY;
bool isLost[51][51] = {};
int dy[4] = {1, 0, -1, 0};
int dx[4] = {0, 1, 0, -1};
char tmp;
int posX, posY, dir;
while (cin >> posX >> posY >> tmp) {
if (tmp == 'N') dir = 0;
else if (tmp == 'E') dir = 1;
else if (tmp == 'S') dir = 2;
else if (tmp == 'W') dir = 3;
string ins;
cin >> ins;
int flag = 1;
for (int i = 0; i < ins.length(); i++) {
char c = ins[i];
if (c == 'L') {
dir = dir - 1;
if (dir < 0) dir += 4;
} else if (c == 'R') {
dir = dir + 1;
if (dir >= 4) dir -= 4;
} else if (c == 'F') {
int nextX = posX + dx[dir], nextY = posY + dy[dir];
if (!isValid(nextX, nextY)) {
if (!isLost[posX][posY]) {
isLost[posX][posY] = 1;
cout << posX << " " << posY << " ";
if (dir == 0) cout << "N";
else if (dir == 1) cout << "E";
else if (dir == 2) cout << "S";
else if (dir == 3) cout << "W";
cout << " LOST" << endl;
flag = 0;
break;
}
} else {
posX = nextX;
posY = nextY;
}
}
}
if (flag) {
cout << posX << " " << posY << " ";
if (dir == 0) cout << "N";
else if (dir == 1) cout << "E";
else if (dir == 2) cout << "S";
else if (dir == 3) cout << "W";
cout << endl;
}
}
return 0;
}
```
## 以前寫的程式碼
```cpp=
#include <bits/stdc++.h>
using namespace std;
int boundX , boundY;
int dx[] = {0 , 1 , 0 , -1};
int dy[] = {1 , 0 , -1 , 0};
vector <pair<int , int>> v;
bool outBound(int x , int y){
return x > boundX || x < 0 || y > boundY || y < 0;
}
int getDir(int d){
if(d == 'N') return 0;
if(d == 'E') return 1;
if(d == 'S') return 2;
if(d == 'W') return 3;
if(d == 0) return 'N';
if(d == 1) return 'E';
if(d == 2) return 'S';
return 'W';
}
void output(int x , int y , int dir , int flag){
dir = getDir(dir);
if(flag){
cout << x << " " << y << " " << (char) dir << " LOST\n";
}
else{
cout << x << " " << y << " " << (char) dir << "\n";
}
}
bool isOff(int x , int y){
for(int i = 0 ; i < v.size() ; i++){
if(x == v[i].first && y == v[i].second){
return 1;
}
}
return 0;
}
bool move(int &x , int &y , int dir){
if(outBound(x + dx[dir] , y + dy[dir])){
if(isOff(x , y)) return 0;
v.push_back(make_pair(x , y));
return 1;
}
x += dx[dir];
y += dy[dir];
return 0;
}
void turnLeft(int &dir){
dir = (dir + 3) % 4;
}
void turnRight(int &dir){
dir = (dir + 1) % 4;
}
int main(){
cin >> boundX >> boundY;
int x , y;
char d;
string ins;
while(cin >> x >> y >> d >> ins){
int dir = getDir(d);
int flag;
for(int i = 0 ; i < ins.length() ; i++){
if(ins.at(i) == 'F'){
flag = move(x , y , dir);
if(flag == 1) break;
} else if(ins.at(i) == 'L'){
turnLeft(dir);
} else if(ins.at(i) == 'R'){
turnRight(dir);
}
}
output(x , y , dir , flag);
}
return 0;
}
```
## 我犯的錯
要仔細看題目
最好多用function