dungeon escape TA
Kotori
c_cpp
a year ago
3.3 kB
10
Indexable
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<queue>
using namespace std;
#define inf 99999
int N, stamina, dungeon[500][500];
int dx[4] = { -1, 0, 1, 0 };
int dy[4] = { 0, 1, 0, -1 };
int cnt_gate;
int dist[205][205];
int mecung[500][500];
class vitri {
public:
int x, y;
};
class Gate {
public:
int row, col, id;
Gate() {
row = col = id = -1;
}
void resetgate()
{
row = col = id = -1;
}
};
class State {
public:
int id, len;
bool operator < (const State& other) const {
return len > other.len;
}
};
Gate gate[500];
int store_gate[205];
void bfs(int start)
{
for (int j = 0; j <= 205; j++)
{
dist[start][j] = inf;
}
dist[start][start] = 0;
queue<vitri> q;
//mecung[start]
q.push({ gate[start].row, gate[start].col });
mecung[gate[start].row][gate[start].col] = 0;
while (!q.empty())
{
vitri cur_v = q.front(); q.pop();
if (dungeon[cur_v.x][cur_v.y] > 0 && dungeon[cur_v.x][cur_v.y] != start)
{
dist[start][dungeon[cur_v.x][cur_v.y]] = mecung[cur_v.x][cur_v.y];
}
for (int i = 0; i < 4; i++)
{
int r = cur_v.x + dx[i];
int c = cur_v.y + dy[i];
if (r >= 0 && r < N && c >= 0 && c < N && dungeon[r][c] != -1
&& mecung[cur_v.x][cur_v.y] + 1 <= stamina
/*&& mecung[cur_v.x][cur_v.y] + 1 <= mecung[r][c]*/)
{
mecung[r][c] = mecung[cur_v.x][cur_v.y] + 1;
q.push({ r,c });
}
}
}
}
void addGate(int mGate, int mRow, int mCol)
{
gate[mGate].row = mRow;
gate[mGate].col = mCol;
gate[mGate].id = mGate;
dungeon[mRow][mCol] = mGate;
store_gate[cnt_gate] = mGate;
cnt_gate++;
return;
}
void removeGate(int mGate)
{
dungeon[gate[mGate].row][gate[mGate].col] = 0;
gate[mGate].resetgate();
return;
}
int getMinTime(int mStart, int mEnd)
{
for (int i = 0; i < cnt_gate; i++)
{
bfs(store_gate[i]);
}
int d[205];
for (int i = 0; i < 205; i++)
{
d[i] = inf;
}
d[mStart] = 0;
priority_queue<State> pq;
pq.push({ mStart, 0 });
while (!pq.empty())
{
State cur_s = pq.top(); pq.pop();
for (int i = 0; i < 205; i++)
{
if (dist[cur_s.id][i] != inf && dist[cur_s.id][i] > 0)
{
if (d[i] > d[cur_s.id] + dist[cur_s.id][i])
{
d[i] = d[cur_s.id] + dist[cur_s.id][i];
pq.push({ i, d[i] });
}
}
}
}
return d[mEnd] == inf ? -1 : d[mEnd];
}
int main()
{
N = 12;
stamina = 6;
cnt_gate = 0;
freopen("input.txt", "r", stdin);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cin >> dungeon[i][j];
dungeon[i][j] *= -1;
cout << dungeon[i][j] << "\t";
mecung[i][j] = inf;
}
cout << endl;
}
addGate(1, 2, 1);
addGate(2, 1, 5);
addGate(3, 7, 1);
addGate(4, 1, 8);
addGate(5, 4, 4);
addGate(6, 9, 5);
addGate(7, 10, 10);
cout << "#############\n";
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cout << dungeon[i][j] << "\t";
}
cout << "\n";
}
int res = getMinTime(2, 3);
res = getMinTime(4, 3);
removeGate(2);
res = getMinTime(4, 3);
res = getMinTime(5, 6);
addGate(8, 7, 7);
res = getMinTime(5, 6);
return 0;
}Editor is loading...
Leave a Comment