Ranking (as of 2013-01-22): 303
Language: C++
/*
UVa 201 - Squares
To build using Visucal Studio 2008:
cl -EHsc -O2 UVa_201_Squares.cpp
*/
#include <iostream>
#include <vector>
using namespace std;
const int n_max = 9;
bool connections[n_max * n_max][n_max * n_max];
// connections[i][j] is true if a line between row = i / n, column = i % n and
// row = j / n, column = j % n
int horizontal_lines[n_max][n_max];
// horizontal_lines[i][j] is the horizontal line length starting from
// row = i, column = j
int vertical_lines[n_max][n_max];
// vertical_lines[i][j] is the vertical line length starting from
// row = i, column = j
int main()
{
int pn = 0;
int n, m;
while (cin >> n >> m) {
if (pn)
cout << "\n**********************************\n\n";
for (int i = 0; i < n * n; i++)
for (int j = 0; j < n * n; j++)
connections[i][j] = false;
while (m--) {
char d;
int i, j;
cin >> d >> i >> j;
i--; j--;
if (i < 0 || i >= n || j < 0 || j >= n)
continue;
if (d == 'H')
connections[i * n + j][i * n + j + 1] = true;
else
connections[j * n + i][(j + 1) * n + i] = true;
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n - 1; j++) {
horizontal_lines[i][j] = 0;
for (int k = j; k < n - 1; k++) {
if (connections[i * n + k][i * n + k + 1])
horizontal_lines[i][j]++;
else
break;
}
}
for (int j = 0; j < n; j++)
for (int i = 0; i < n - 1; i++) {
vertical_lines[i][j] = 0;
for (int k = i; k < n - 1; k++) {
if (connections[k * n + j][(k + 1) * n + j])
vertical_lines[i][j]++;
else
break;
}
}
cout << "Problem #" << pn + 1 << endl << endl;
int nr_total_squares = 0;
for (int s = 1; s < n; s++) {
int nr_squares = 0;
for (int i = 0; i < n - s; i++)
for (int j = 0; j < n - s; j++)
if (horizontal_lines[i][j] >= s && horizontal_lines[i + s][j] >= s &&
vertical_lines[i][j] >= s && vertical_lines[i][j + s] >= s)
nr_squares++;
if (nr_squares) {
nr_total_squares += nr_squares;
cout << nr_squares << " square (s) of size " << s << endl;
}
}
if (!nr_total_squares)
cout << "No completed squares can be found.\n";
pn++;
}
return 0;
}
No comments:
Post a Comment