// 一个正方形类
struct Squere
{
vector <vector< vector<char >>> image; // 存储一个图形
int node; // 为n*n 的图形
// 初始化
Squere(int n) {
node = n;
vector<vector<char>> t(n, { '.','.' });
for (int i = 0; i < n; i++) { image.push_back(t); }
}
// 对每一种边长遍历
map<int,int> getAns()
{
map<int, int>ans;
for (int i = 1; i < node; i++) {
for (int j = 0; j < node; j++)
for (int k = 0; k < node; k++) {
bool is = isSqures(i, j, k,node);
if (is && ans.find(i) == ans.end()) ans[i] = 1;
else if (is) ans[i]++;
}
}
return ans;
}
// 判断是否能构成正方形
bool isSqures(int length, int x, int y, int n)
{
if (x + length >= n || y + length >= n) return 0;
for (int i = x; i < x + length; i++) if (image[i][y][0] != 'v' || image[i][y + length][0] != 'v') return 0;
for (int i = y; i < y + length; i++) if (image[x][i][1] != 'h' || image[x + length][i][1] != 'h')return 0;
return 1;
}
};
int main()
{
// freopen("my_ans.txt", "w", stdout);
int n, m; int promblem = 0;
while (cin >> n) {
cin >> m;
if (promblem) cout << "\n**********************************\n\n";
cout << "Problem #" << ++promblem << "\n\n";
Squere s(n);
for (int i = 0; i < m; i++) {
char type; int x, y; cin >> type >> x >> y;
switch (type)
{
case 'H':s.image[x - 1][y - 1][1] = 'h'; break;
case 'V':s.image[y - 1][x - 1][0] = 'v';
}
}
map<int, int>ans = s.getAns();
if (ans.empty()) cout << "No completed squares can be found." << endl;
else {
map<int, int>::iterator it = ans.begin();
while (it != ans.end()) { cout << it->second << " square (s) of size " << it->first << endl; it++; }
}
}
return 0;
}
这个代码简单,但细节真的好多
和OJ上的数据跑了N组老有格式错误,打代码时间可能还没有改格式时间长....
记录一下代码过程