题意:给定一个n*n的小黑点构成的正方形,还有m条线段用来链接这些黑点,问所有连线能构成多少个正方形(每种边长分别统计)。
思路:因为题目给的n范围略小,所以用了枚举的方法,分别用两个三维数组[行][起点][终点],列对应[列][起点][终点]表示图里的点之间是否有连线,如果第一行点1~点2有连线,点2到点3有连线,即:h[1][1][2]=h[1][2][3]=h[1][1][3]=1;然后从变长为1的小正方形搜,从上到下,从左到右,最后输出结果,注意格式要求。
#include <bits/stdc++.h>
using namespace std;
/*freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);*/
#define ll long long
#define maxc 10010
#define mod 7
int h[20][20][20];//横
int s[20][20][20];//竖
int p(int n,int m){
int sum=0;
for(int i=1;i<m;i++){
for(int j=1;j<=m-n;j++){
if(h[i][j][j+n]==1&&h[i+n][j][j+n]==1&&s[j][i][i+n]==1&&s[j+n][i][i+n]==1)
sum++;
}
}
return sum;
}
int main()
{
int n;
int cs=0;
/*freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);*/
while(scanf("%d",&n)==1){
cs++;
if(cs!=1)
printf("\n**********************************\n\n");
memset(h,0,sizeof(h));
memset(s,0,sizeof(s));
int t;
cin>>t;
int a,b;
char c;
while(t--){
cin>>c>>a>>b;
if(c=='H'){
h[a][b][b+1]=1;
}
else
s[a][b][b+1]=1;
}
int k;
for(int i=1;i<=n;i++){
for(int j=1;j<n;j++){
k=j;
while(h[i][k][k+1]){
h[i][j][k+1]=1;
k++;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<n;j++){
k=j;
while(s[i][k][k+1]){
s[i][j][k+1]=1;
k++;
}
}
}
printf("Problem #%d\n\n",cs);
int ans[10];
int sum=0;
for(int i=1;i<=n;i++){
ans[i]=p(i,n);
sum+=ans[i];
}
if(sum==0)
printf("No completed squares can be found.\n");
else{
for(int i=1;i<=n;i++){
if(ans[i]!=0)
printf("%d square (s) of size %d\n",ans[i],i);
}
}
}
return 0;
}
版权声明:本文为qq_40894594原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。