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;
}