#23280: answer hahaa


jameslee55566@gmail.com (李俊翰)

學校 : 不指定學校
編號 : 131420
來源 : [111.252.127.159]
最後登入時間 :
2022-05-29 12:13:43
e287. 機器人的路徑 -- APCS | From: [140.128.156.248] | 發表日期 : 2020-11-03 15:14

hello everyone this is my code_
#include <iostream> using namespace std; struct position { int x, y; }; void findInitialPosition(int** ary, position& position, int n, int m); int moveProcedure(int** ary, bool** movable, position initialPosition, int n, int m); void waysAbleToMove(bool** movable, position& position, bool waysAvailabel[4], int n, int m); inline int searchForSmallest(int nums[4]); int main() { int n, m; cin >> n >> m; int** ary = new int* [n]; for (int i = 0; i < n; i++) ary[i] = new int[m]; bool** movable = new bool* [n]; for (int i = 0; i < n; i++) movable[i] = new bool[m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> ary[i][j]; movable[i][j] = true; } } position position; findInitialPosition(ary, position, n, m); cout << moveProcedure(ary, movable, position, n, m); return 0; } void findInitialPosition(int** ary, position& position, int n, int m) { int temp = 0x7fffffff; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (ary[i][j] <= temp) { position.x = i; position.y = j; temp = ary[i][j]; } } } } int moveProcedure(int** ary, bool** movable, position Position, int n, int m) { int count = 0; while (true) { count += ary[Position.x][Position.y]; bool waysAvailable[4] = { false }; waysAbleToMove(movable, Position, waysAvailable, n, m); if (!(waysAvailable[0] || waysAvailable[1] || waysAvailable[2] || waysAvailable[3])) return count; else { int nums[4] = {0x7fffffff ,0x7fffffff ,0x7fffffff ,0x7fffffff }; if (waysAvailable[0]) nums[0] = ary[Position.x + 1][Position.y]; if (waysAvailable[1]) nums[1] = ary[Position.x - 1][Position.y]; if (waysAvailable[2]) nums[2] = ary[Position.x][Position.y + 1]; if (waysAvailable[3]) nums[3] = ary[Position.x][Position.y - 1]; int smallestWay = searchForSmallest(nums); switch (smallestWay) { case 0:Position.x += 1; break; case 1:Position.x -= 1; break; case 2:Position.y += 1; break; case 3:Position.y -= 1; break; } } } //loop ends } void waysAbleToMove(bool** movable, position& position, bool waysAvailabel[4], int n, int m) { //turn current position to false movable[position.x][position.y] = false; //check border and outer layer's bool if (position.x < n - 1)// +x { if (movable[position.x + 1][position.y] == true) waysAvailabel[0] = true; } if (position.x > 0)// -x { if (movable[position.x - 1][position.y] == true) waysAvailabel[1] = true; } if (position.y < m - 1)// +y { if (movable[position.x][position.y + 1] == true) waysAvailabel[2] = true; } if (position.y > 0)// -y { if (movable[position.x][position.y - 1] == true) waysAvailabel[3] = true; } } inline int searchForSmallest(int nums[4]) { if (nums[0] < nums[1] && nums[0] < nums[2] && nums[0] < nums[3]) return 0; if (nums[1] < nums[0] && nums[1] < nums[2] && nums[1] < nums[3]) return 1; if (nums[2] < nums[1] && nums[2] < nums[0] && nums[2] < nums[3]) return 2; if (nums[3] < nums[1] && nums[3] < nums[2] && nums[3] < nums[0]) return 3; }
 
ZeroJudge Forum