我也不知道我做的对不对,反正先发上来讨论一下吧,看看有没有更好一点的算法。感觉我这种方法太笨拙了,但是好歹把它写出来了。看看有没有好的方法精简一下代码。
#include <stdio.h>
#include <string.h>
#include <math.h>
struct dot
{
int x;
int y;
};
int main()
{
char str[30];
printf("pls enter the direction(U/D/L/R):\n");
gets(str);
struct dot line,*pp;
int i,j=0;
int temp,area[30]={0};
int arr[4]={0};
pp=&line;//设定原点
pp->x=0;
pp->y=0;
for(i=0;str[i]!='\0';i++)
{
temp=0;
switch(str[i])
{
case 'U':pp->y++;break;
case 'D':pp->y--;break;
case 'L':pp->x--;break;
case 'R':pp->x++;break;
}//上下左右,对应的坐标加减
if(str[i+1]!=str[i])
temp=line.x*line.y;//即将出现的下一个字母如果与当前字母不同,
//计算当前坐标与原点构成的面积
if(temp)
{
if(j%2==0)
area[i]=(-1)*temp;
else
area[i]=temp;
j++;
}//第一个面积为+,第二个面积则为-。
if(pp->x>=0&&pp->y>=0)
arr[0]=i;
else if(pp->x<=0&&pp->y>=0)
arr[1]=i;
else if(pp->x<=0&&pp->y<=0)
arr[2]=i;
else
arr[3]=i;
}//划分不同象限对应的面积在area[]中的存储界限。
int min,t;
for(i=0;i<3;i++)
{
min=i;
for(j=i+1;j<4;j++)
{
if(arr[min]>arr[j])
min=j;
}
t=arr[min];arr[min]=arr[i];arr[i]=t;
}//把界限从小达到排序
int area1=0,area2=0,area3=0,area4=0;
for(i=0;str[i]!='\0';i++)
{
if(i<=arr[0])
area1+=area[i];
else if(i<=arr[1]&&i>=arr[0])
area2+=area[i];
else if(i<=arr[2]&&i>=arr[1])
area3+=area[i];
else area4+=area[i];
}//计算各象限的面积之和;
int TotalArea;
TotalArea=abs(area1)+abs(area2)+abs(area3)+abs(area4);
if(pp->x!=0&&pp->y!=0)
printf("Total area is 0\n");
else
printf("Total area is %d\n",TotalArea);//最后一个坐标是否回到原点,否则面积为0;
return 0;
}
[
本帖最后由 soler 于 2009-8-8 18:23 编辑 ]