像我其他文章中写的一样,读题很重要,CSDN上有 紫书的原题资源。
这题我的思路是用数组存储线段,用r1,r2,c1,c2的值使不同的线段被储存。
(可以理解成不同的向量)
#include<stdio.h>
#include<string.h>
#define maxn 12
#define c1 1 //此部分是我的解题
#define c2 10 //思想的核心
#define r1 100 //<---------
#define r2 1000 //<---------
int q[maxn][maxn],cnt[maxn],m,n;
int main()
{
char cmd[2];
int x,y,kase=0;
while(scanf("%d %d",&n,&m)==2){
memset(q,0,sizeof(q));
memset(cnt,0,sizeof(cnt));
while(m--){
scanf("%s %d %d",cmd,&x,&y); //输入线段
if(cmd[0]=='H'){
q[x][y]+=r1;
q[x][y+1]+=r2;
}
else{
q[y][x]+=c1;
q[y+1][x]+=c2;
}
}
for(int i=1;i<=n;i++){//每个正方形从左上角开始判断
for(int j=1;j<=n;j++){
if(q[i][j]%r2>=r1 && q[i][j]%c2>=c1){
search(i,j);//为r或c线段的第一条时
} //进行下面的判断
}
}
printf("Problem #%d\n\n",++kase);//没怎么看输出格式,可能格式不标准
int count=0;
for(int i=1;i<=n;i++){
if(cnt[i]){
printf("%d square(s) of size %d\n",cnt[i],i);
count++;
}
}
if(!count)
printf("No completed squares can be found\n");
printf("\n");
for(int i=0;i<34;i++)
printf("*");
printf("\n");
}
return 0;
}
void search(int x,int y)
{
int i,j,mark;
for(i=1;i<=n&&x+i<=n&&y+i<=n;i++){
for(j=1,mark=1;j<=i;j++){
if(q[x][y+j]/r2==0 || q[x+j][y]%r1<c2 || q[x+i][y+j]/r2==0 || q[x+j][y+i]%r1<c2)
mark=0;
}
if(mark)
cnt[i]++;
}
}
/*sample input&output
4
16
H 1 1
H 1 3
H 2 1
H 2 2
H 2 3
H 3 2
H 4 2
H 4 3
V 1 1
V 2 1
V 2 2
V 2 3
V 3 2
V 4 1
V 4 2
V 4 3
2
3
H 1 1
H 2 1
V 1 2
*/
画出我上面的图能更好地理解。
未完待续。。。
如有错误纰漏,请指出