代码拉取完成,页面将自动刷新
#include<iostream>
#include<string>
#include<cstdio>
// #include<stdio.h>
#include<vector>
#include<cstdlib>
#include<cstring>
using namespace std;
// std::ios::sync_with_stdio(false);
const int MAX_SIZE = 12;
int maze[MAX_SIZE][MAX_SIZE][2];
int ans[MAX_SIZE];
bool IsSequare(int i,int j,int k){
for(int p=0 ; p<k ; p++){
if( maze[i][j+p][0] == 0
|| maze[i+p][j][1] == 0
|| maze[i+k][j+p][0] == 0
|| maze[i+p][j+k][1] == 0)
{
return false;
}
}
return true;
}
int main(){
// freopen("./out.txt", "w", stdout);
int n,m,maze_i,maze_j;
char ch;
int count = 1;
while(cin >> n >> m){
// 初始化并读取输入构造矩阵
memset(maze,0,sizeof(maze));
memset(ans,0,sizeof(ans));
bool flag = false; // 是否有
for(int i=0;i<m;i++){
cin>>ch>>maze_i>>maze_j;
if(ch == 'H'){
// 第i行,j到j+1列连线
maze[maze_i][maze_j][0] = 1;
} else {
// 第i列 j到j+1行连线
maze[maze_j][maze_i][1] = 1;
}
}
// ij0表示第i行第j个点此点往右的横线
// ij1表示第i行第j个点此点往下的横线
// 下面便是在这个三维矩阵中进行判断了
// 现在是按边来存
for(int i=1;i<n;i++){
for(int j=1;j<n;j++){
if(maze[i][j][0] == 1 && maze[i][j][1]==1){
// 取到当前所能得到的最大矩形
int cur = n-i > n-j ? n-j : n-i;
for(int k=1;k<=cur;k++){
if(IsSequare(i,j,k)){
ans[k]++;
flag = true;
}
}
}
}
}
if(count > 1){
cout<<"\n**********************************\n\n";
}
cout<<"Problem #"<<count<<endl<<endl;
if(flag){
for(int i=1 ; i<n ; i++){
if(ans[i] != 0){
cout<<ans[i]<<" square (s) of size "<<i<<endl;
}
}
} else {
cout<<"No completed squares can be found.\n";
}
count++;
}
return 0;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。