读书人

c菜鸟。这个程序到底错哪了

发布时间: 2013-06-25 23:45:42 作者: rapoo

c初学者。这个程序到底哪里错了?
题目:
Description
给出一个8*8的01矩阵,请判断出由数字1所填充的图形(三角形/梯形/椭圆形/矩形)。

Input
第一行输入N,表示有N组测试数据 接下来八行为矩阵内容,每两个数字中间用一个空格隔开 每两个矩阵中间有一个空行

Output
输出判断出的形状,每个占一行(三角形输出"triangle",梯形输出"trapezia",椭圆输出"ellipse",矩形输出"rectangle") 你可以在纸上画个图形看看,每种图都是有不同的特点。如 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0是椭圆 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 是梯形 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 0 0 1 1 1 0 0 0


Sample Input

2
0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 0
0 0 1 1 1 1 1 0
0 0 1 1 1 1 1 0
0 0 1 1 1 1 1 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 0
0 0 1 1 1 1 0 0
0 0 1 1 1 0 0 0
0 0 1 1 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

Sample Output

rectangle
triangle
Hint梯形的底一定处于水平线上,不会出现特殊情况





我的代码:
#include<stdio.h>
int main()
{
char a[8][15];
int i,j,t;
int r[8],c[15],s1=0,s2=0,flag=0,n,max,maxi;
scanf("%d",&n);
getchar();
for(t=0;t<n;t++)
{
for(i=0;i<8;i++)
{
r[i]=0;
for(j=0;j<15;j++)
{
a[i][j]='\0';
c[j]=0;
}
}
s1=0;
s2=0;
flag=0;


for(i=0;i<8;i++)
{
gets(a[i]);
if(a[i][0]=='\0')
i=i-1;
}


for(i=0;i<8;i++)
{
s1=0;
for(j=0;j<15;j++)
{
if(a[i][j]=='1')
s1++;
}
r[i]=s1;
}
for(i=0;i<15;i++)
{
s2=0;
for(j=0;j<8;j++)
{
if(a[j][i]=='1')
s2++;
}
c[i]=s2;
}


s1=0;
s2=0;
max=c[0];
maxi=0;
for(i=1;i<8;i++)
{
if(r[i]>max)
{
max=r[i];
maxi=i;
}
}
for(i=0;i<15;i++)
{
if(r[i]==1)
s1++;
if(c[i]==1)
s2++;
}
if(s1==1&&max!=1)
{
flag=1;
printf("triangle\n");
continue;
}
if(s2==2&&r[maxi+1]!=r[maxi-1]&&r[maxi]!=r[maxi+1])
{
flag=1;
printf("trapezia\n");
continue;
}


for(i=0;i<7;i++)
{
if(r[i]!=0)


{
if(r[i]==r[i+1]||r[i+1]==0)
{
flag=1;
printf("rectangle\n");
break;
}
else
break;
}
}
if(flag==1)
continue;
printf("ellipse\n");
}
return 0;
}


被wrong的受不了了。
[解决办法]
先假设所有的线段都是水平的或者竖直的或者45°斜的,如果出现下面的图形
00000000
01000000
00110000
00111100
00011111
00011110
00001100
00001000
会很别扭的....

先划掉纯零的行和纯零的列,得到一个新的数组W,并记录下新数组W的长X和宽Y(保证X>=Y,为了下面讨论的方便),然后统计W的4个角的1的数量N,然后讨论各种情况..比如
N==4必然是矩形
N==3可能是三角形或梯形,X==Y就是等腰直角三角形,X!=Y就是直角梯形
N==2可能是三角形或梯形,X==2Y-1就是等腰直角三角形,X>2Y-1就是等腰梯形,X<2Y-1...貌似不存在
N==1的情况...貌似不存在
N==0可能是正方形或是椭圆,统计一下1的数量M,若X*Y==2M-1就是正方形,否则就是椭圆

大概这么个思路,有遗漏的情况欢迎补充...

读书人网 >C语言

热点推荐