Az alábbi letöltési lehetőségek közül választhatsz: (
segítség)
Típus: text/plain
Tartalmaz szöveget
Karakterkódolás: us-ascii
Méret: 3 KB
#include <iostream>
#include <fstream>
using namespace std;
#define MaxMap 100
#define MaxW 100
#define MaxH 100
#define MaxAlt 9999
#define MaxLabel 26
struct sMap {
int H, W;
struct sField {
short Alt;
char ToX, ToY;
char Label;
} Field[MaxH][MaxW];
};
bool Read (const char *, int &, sMap *);
bool Write (const char *, int, const sMap *);
bool FindLowestNeighbour (sMap &, int, int, int &, int &);
void Solve (sMap &);
void SortLabels (sMap &);
int main (int nArgs, char * Arg []) {
sMap Map;
int Num, I, J, K;
if (nArgs < 3)
return 1;
fstream Fin(Arg[1], fstream::in), Fout(Arg[2], fstream::out);
if (Fin.fail() || Fout.fail()) {
Fin.close();
Fout.close();
return 1;
}
Fin >> Num;
for (I = 0; I < Num; I++) {
Fin >> Map.H >> Map.W;
for (J = 0; J < Map.H; J++)
for (K = 0; K < Map.W; K++)
Fin >> Map.Field[J][K].Alt;
Solve(Map);
SortLabels(Map);
Fout << "Case #" << I + 1 << endl;
for (J = 0; J < Map.H; J++) {
for (K = 0; K < Map.W; K++)
Fout << Map.Field[J][K].Label << " ";
Fout << endl;
}
}
Fin.close();
Fout.close();
return 0;
}
bool FindLowestNeighbour (sMap & Map, short X, short Y) {
short Min = Map.Field[Y][X].Alt;
if (Y > 0 && Map.Field[Y - 1][X].Alt < Min) {
Min = Map.Field[Y - 1][X].Alt;
Map.Field[Y][X].ToX = X;
Map.Field[Y][X].ToY = Y - 1;
}
if (X > 0 && Map.Field[Y][X - 1].Alt < Min) {
Min = Map.Field[Y][X - 1].Alt;
Map.Field[Y][X].ToX = X - 1;
Map.Field[Y][X].ToY = Y;
}
if (X + 1 < Map.W && Map.Field[Y][X + 1].Alt < Min) {
Min = Map.Field[Y][X + 1].Alt;
Map.Field[Y][X].ToX = X + 1;
Map.Field[Y][X].ToY = Y;
}
if (Y + 1 < Map.H && Map.Field[Y + 1][X].Alt < Min) {
Min = Map.Field[Y + 1][X].Alt;
Map.Field[Y][X].ToX = X;
Map.Field[Y][X].ToY = Y + 1;
}
return Min < Map.Field[Y][X].Alt;
}
void Solve (sMap & Map) {
int I, J;
int Label = 0;
int M;
for (I = 0; I < Map.H; I++)
for (J = 0; J < Map.W; J++)
if (FindLowestNeighbour(Map, J, I))
Map.Field[I][J].Label = -1;
else
Map.Field[I][J].Label = Label++;
do {
M = 0;
for (I = 0; I < Map.H; I++)
for (J = 0; J < Map.W; J++) {
Label = Map.Field[Map.Field[I][J].ToY][Map.Field[I][J].ToX].Label;
if (Map.Field[I][J].Label == -1 && Label != -1) {
Map.Field[I][J].Label = Label;
M++;
}
}
} while (M > 0);
}
void SortLabels (sMap & Map) {
int I, J;
char Lab[MaxLabel], Label = 'a';
for (I = 0; I < MaxLabel; I++)
Lab[I] = -1;
for (I = 0; I < Map.H; I++)
for (J = 0; J < Map.W; J++) {
if (Lab[Map.Field[I][J].Label] == -1)
Lab[Map.Field[I][J].Label] = Label++;
Map.Field[I][J].Label = Lab[Map.Field[I][J].Label];
}
}