Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 550    Accepted Submission(s): 107

 

    本题其实很简单,但是想要想到转化也很不容易,因为本题是求面积之和,但是两个矩形有可能会重合在一起,所以这是就需要将所有矩形的分割成一个一个单位的小正方形。这样就可以对他们进行标记。最后查找被标记小正方形的个数。

注意:需要处理没用的字符,在所给的字符串中可能会出现各种不同没用的字符,一定要把他们给清除掉,我在这就wrong了几次

代码:

1 #include<stdio.h>
2 #include<string.h>
3 #include<ctype.h>
4  int mark[1005][1005];
5  int min(int x,int y)
6 {
7 if(x>y)
8 return y;
9 return x;
10 }
11  int max(int x,int y)
12 {
13 if(x>y)
14 return x;
15 return y;
16 }
17  int main()
18 {
19 char a[505];
20 int i,j,k,sum,count,d[5],minx,miny,maxx,maxy,mark1,len;
21 while(gets(a))
22 {
23 count=0;
24 len=strlen(a);
25 memset(mark,0,sizeof(mark));
26 for(i=0;i<len;i++)
27 {
28 if(a[i]=='(')
29 {
30 k=0;sum=0;mark1=0;
31 for(j=i+1;k<4;j++)
32 {
33 if(isdigit(a[j]))
34 {
35 mark1=1;
36 sum=sum*10+a[j]-'0';
37 }
38 else if(mark1==0)
39 continue;
40 else
41 {
42 d[++k]=sum;
43 sum=0;
44 mark1=0;
45 }
46 }
47 i=j;
48 minx=min(d[1],d[3]);
49 miny=min(d[2],d[4]);
50 maxx=max(d[1],d[3]);
51 maxy=max(d[2],d[4]);
52 for(j=minx;j<maxx;j++)
53 for(k=miny;k<maxy;k++)
54 {
55 if(mark[j][k]==0)
56 {
57 mark[j][k]=1;
58 count++;
59 }
60 }
61 }
62 }
63
64 printf("%d\n",count);
65 }
66 return 0;
67 }
68
69
70