习题4-2 正方形 UVa201
2016-11-01 10:28
405 查看
算法竞赛入门经典(第2版)第4章
函数和递归
习题4-2
正方形 UVa201
感悟。
1、阅读书中题目,从网站下载英文原题,重点在看输出数据与格式。
2、粗看题目图形,很象安卓系统的锁屏解码界面。
3、基本思路如下,第一次扫描边长为1正方形个数,第二次扫描边长为2正方形个数,
第n次扫描边长为n正方形个数。
4、扫描方式,逐行扫描,逐点判断,注意越界处理。
5、感觉此题比习题4-1
象棋 UVa1589 简单,当然,还没有开始编代码。
6、写着,感觉此题有《算法竞赛入门经典(第2版)》P40程序3-3
蛇形填数的痕迹。
7、在处理水平线,竖直线觉得有些别扭,水平线数据(行,列),竖直线数据(列,行)。
8、程序编写,没法做到一次性成功,跟踪调试是免不了的,很快就把测试样例通过了。
9、提交AC,很久很久没有做到一次提交就AC了,很是高兴,看看时间2016-11-1。
附上AC代码,编译环境Dev-C++4.9.9.2
#include
<stdio.h>
#include <string.h>
const int maxn=11;
int H[maxn][maxn],V[maxn][maxn];
int count[maxn]; //count[1]边长1个数;count[2]边长2个数。......
//行边长判别,row确定边起点的行位置,start确定边起点的列位置,k是边长
int Hline(int row,int start,int k){//一条水平边长有无判断,有返回1,无返回0
int j;
for(j=start;j<start+k;j++){
if(H[row][j]==0)//无边
return 0;
}
return 1;//有连续的边
}
//列边长判别,col确定边起点的列位置,start确定边起点的行位置,k是边长
int Vline(int col,int start,int k){// 一条竖直边长有无判断,有返回1,无返回0
int j;
for(j=start;j<start+k;j++){
if(V[col][j]==0)
return 0;
}
return 1;
}
int main(){
int T=0;
int n,m;
int i,j,k;
char s[2];
int ans;
int ansup,ansdown,ansleft,ansright;
int print;
while(scanf("%d%d",&n,&m)!=EOF){
memset(H,0,sizeof(H));//初始化H数组
memset(V,0,sizeof(V));//初始化V数组
memset(count,0,sizeof(count));//初始化边计数。
if(T>0)
printf("\n**********************************\n\n");
T++;
for(k=0;k<m;k++){//连线读取
scanf("%s%d%d",s,&i,&j);//用字符串来处理字符,直接读取字符会有很多问题,详见习题4-1象棋UVa1589的解答
switch(s[0]){
case 'H':
H[i][j]=1;
break;
case 'V':
V[i][j]=1;
break;
}
}
for(k=1;k<=n-1;k++){//边数扫描
for(i=1;i<=n-k;i++){//行扫描
for(j=1;j<=n-k;j++){//列扫描
ans=1;
ansup=Hline(i,j,k);//上水平边
ansdown=Hline(i+k,j,k);//下水平边
ansleft=Vline(j,i,k);//左竖直边
ansright=Vline(j+k,i,k);//右竖直边
ans=ans*ansup*ansdown*ansleft*ansright;
// printf("%d %d %d %d %d %d %d %d\n",ans,ansup,ansdown,ansleft,ansright,i,j,k);
if(ans)
count[k]++;
}
}
}
printf("Problem #%d\n\n",T);
print=0;
for(i=1;i<=8;i++)//打印统计数据
if(count[i]>0){
printf("%d square (s) of size %d\n",count[i],i);
print=1;
}
if(print==0)
printf("No completed squares can be found.\n");
}
return 0;
}
函数和递归
习题4-2
正方形 UVa201
感悟。
1、阅读书中题目,从网站下载英文原题,重点在看输出数据与格式。
2、粗看题目图形,很象安卓系统的锁屏解码界面。
3、基本思路如下,第一次扫描边长为1正方形个数,第二次扫描边长为2正方形个数,
第n次扫描边长为n正方形个数。
4、扫描方式,逐行扫描,逐点判断,注意越界处理。
5、感觉此题比习题4-1
象棋 UVa1589 简单,当然,还没有开始编代码。
6、写着,感觉此题有《算法竞赛入门经典(第2版)》P40程序3-3
蛇形填数的痕迹。
7、在处理水平线,竖直线觉得有些别扭,水平线数据(行,列),竖直线数据(列,行)。
8、程序编写,没法做到一次性成功,跟踪调试是免不了的,很快就把测试样例通过了。
9、提交AC,很久很久没有做到一次提交就AC了,很是高兴,看看时间2016-11-1。
附上AC代码,编译环境Dev-C++4.9.9.2
#include
<stdio.h>
#include <string.h>
const int maxn=11;
int H[maxn][maxn],V[maxn][maxn];
int count[maxn]; //count[1]边长1个数;count[2]边长2个数。......
//行边长判别,row确定边起点的行位置,start确定边起点的列位置,k是边长
int Hline(int row,int start,int k){//一条水平边长有无判断,有返回1,无返回0
int j;
for(j=start;j<start+k;j++){
if(H[row][j]==0)//无边
return 0;
}
return 1;//有连续的边
}
//列边长判别,col确定边起点的列位置,start确定边起点的行位置,k是边长
int Vline(int col,int start,int k){// 一条竖直边长有无判断,有返回1,无返回0
int j;
for(j=start;j<start+k;j++){
if(V[col][j]==0)
return 0;
}
return 1;
}
int main(){
int T=0;
int n,m;
int i,j,k;
char s[2];
int ans;
int ansup,ansdown,ansleft,ansright;
int print;
while(scanf("%d%d",&n,&m)!=EOF){
memset(H,0,sizeof(H));//初始化H数组
memset(V,0,sizeof(V));//初始化V数组
memset(count,0,sizeof(count));//初始化边计数。
if(T>0)
printf("\n**********************************\n\n");
T++;
for(k=0;k<m;k++){//连线读取
scanf("%s%d%d",s,&i,&j);//用字符串来处理字符,直接读取字符会有很多问题,详见习题4-1象棋UVa1589的解答
switch(s[0]){
case 'H':
H[i][j]=1;
break;
case 'V':
V[i][j]=1;
break;
}
}
for(k=1;k<=n-1;k++){//边数扫描
for(i=1;i<=n-k;i++){//行扫描
for(j=1;j<=n-k;j++){//列扫描
ans=1;
ansup=Hline(i,j,k);//上水平边
ansdown=Hline(i+k,j,k);//下水平边
ansleft=Vline(j,i,k);//左竖直边
ansright=Vline(j+k,i,k);//右竖直边
ans=ans*ansup*ansdown*ansleft*ansright;
// printf("%d %d %d %d %d %d %d %d\n",ans,ansup,ansdown,ansleft,ansright,i,j,k);
if(ans)
count[k]++;
}
}
}
printf("Problem #%d\n\n",T);
print=0;
for(i=1;i<=8;i++)//打印统计数据
if(count[i]>0){
printf("%d square (s) of size %d\n",count[i],i);
print=1;
}
if(print==0)
printf("No completed squares can be found.\n");
}
return 0;
}
相关文章推荐
- 算法竞赛入门经典(第2版)习题4-2 正方形 Squares UVa201
- 算法竞赛入门经典(第2版)习题4-2 正方形UVa201
- 习题4-2 正方形 UVa201
- 紫书章四习题 2 Squares UVA - 201 (找有几个正方形)
- UVa201 正方形
- uva 201 习题4-2
- 紫书章四习题 2 Squares UVA - 201 (找有几个正方形)
- UVa 201 Squares(正方形)
- 紫书章四习题 2 Squares UVA - 201 (找有几个正方形)
- 算典04_习题_02_UVA-201
- UVA-201-正方形
- 习题7-6 重叠的正方形 UVa12113
- uva 201 - Squares(数正方形)
- UVA-4.2-正方形-201
- UVA201正方形
- 正方形(squares,UVa201)
- ACM/ICPC World Finals 1990 && UVA 201 Squares(数正方形)
- UVa 201 Squares(正方形)
- 习题10-3 UVA 1643 Angle and Squares 角度和正方形
- uva 201 数正方形数