Ranking (as of 2013-08-31): 690 out of 811
Language: C++
/*
UVa 556 - Amazing
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_556_Amazing.cpp
*/
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
const int nr_visited = 5;
enum {north, south, east, west};
int turn_right(int b, int w, vector< vector<char> >& maze, int dir, int i, int j)
{
int wi, wj;
switch (dir) {
case north:
j++; wi = i + 1; wj = j; break;
case south:
j--; wi = i - 1; wj = j; break;
case east:
i++; wi = i; wj = j - 1; break;
case west:
i--; wi = i; wj = j + 1; break;
}
if (i < 0 || i >= b || j < 0 || j >= w || maze[i][j] == '1')
return dir;
if (wi < 0 || wi >= b || wj < 0 || wj >= w || maze[wi][wj] == '1') {
switch (dir) {
case north:
dir = east; break;
case south:
dir = west; break;
case east:
dir = south; break;
case west:
dir = north; break;
}
}
return dir;
}
int turn_left(int dir)
{
switch (dir) {
case north:
dir = west; break;
case south:
dir = east; break;
case east:
dir = north; break;
case west:
dir = south; break;
}
return dir;
}
bool step_forward(int b, int w, vector< vector<char> >& maze,
int dir, int& i, int& j)
{
int ni = i, nj = j;
switch (dir) {
case north:
ni--; break;
case south:
ni++; break;
case east:
nj++; break;
case west:
nj--; break;
}
if (ni < 0 || ni >= b || nj < 0 || nj >= w || maze[ni][nj] == '1')
return false;
i = ni; j = nj;
return true;
}
int main()
{
while (true) {
int b, w;
cin >> b >> w;
if (!b && !w)
break;
vector< vector<char> > maze(b, vector<char>(w));
vector< vector<int> > visited(b, vector<int>(w, 0));
for (int i = 0; i < b; i++)
for (int j = 0; j < w; j++)
cin >> maze[i][j];
int si = b - 1, sj = 0, i = b - 1, j = 0, dir = east;
vector<int> visited_total(nr_visited, 0);
while (true) {
dir = turn_right(b, w, maze, dir, i, j);
if (step_forward(b, w, maze, dir, i, j)) {
visited[i][j]++;
if (i == si && j == sj)
break;
}
else
dir = turn_left(dir);
}
for (int i = 0; i < b; i++)
for (int j = 0; j < w; j++)
if (maze[i][j] == '0' && visited[i][j] < nr_visited)
visited_total[visited[i][j]]++;
for (int i = 0; i < nr_visited; i++)
cout << setfill(' ') << setw(3) << visited_total[i];
cout << endl;
}
return 0;
}
No comments:
Post a Comment