呵呵,這個題目做出來時候很開心,因為用到了一個小技巧,就是標記格子時候用2進制的變化規則來存儲,這樣絕不會出現重復,而這個數字最大是2^50,所以要用GCC/G++的long long型C/C++的__int64來存儲。呵呵,這樣做就只需要判格子即可不需要判邊,最后一個DFS查數量就AC了,但是這是數據量范圍決定的,>64的就沒法這樣做了~注意輸入數字的大小順序和自己的程序不符的時候要判斷并互換才可以。
附上AC代碼,呵呵,blog建立到現在有好幾十的閱讀量了,很高興。我在ACM上還是個最菜的級別~希望能通過這個Blog堅持下去,并與大家交流得以提高&&認識些朋友~呵呵,希望大家留個言哈``
1
#include<stdio.h>
2
#include<string.h>
3
long long cake[20][20];
4
int used[20][20];
5
long long now;
6
int w,h;
7
long long po(int a , int b )
{
8
long long temp;
9
temp = 1 ;
10
for(int i = 0 ; i < b ; i++)
{
11
temp = 2*temp;
12
}
13
return temp;
14
}
15
16
void dfs(int j , int i )
{
17
if(i<0||j<0||i>=w||j>=h) return;
18
if(used[j][i]!=0) return;
19
if(cake[j][i]!=now) return;
20
used[j][i]=1;
21
dfs(j+1,i);
22
dfs(j-1,i);
23
dfs(j,i+1);
24
dfs(j,i-1);
25
}
26
27
int main()
{
28
int count;
29
int t;
30
long long im;
31
int n;
32
int x1,x2,y1,y2;
33
while(scanf("%d%d",&w,&h)&&w&&h)
{
34
scanf("%d",&n);
35
memset(cake,-1,sizeof(cake));
36
memset(used,-1,sizeof(used));
37
count=0;
38
for(int i = 0 ; i < w ; i++ )
39
for(int j = 0 ; j < h ; j++ )
40
{ cake[j][i] = 0 ;
41
used[j][i] = 0 ;
42
}
43
for(int i = 0 ; i < n ; i++ )
{
44
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
45
46
if (x1>x2)
{t=x1;x1=x2;x2=t;}
47
if (y1>y2)
{t=y1;y1=y2;y2=t;}
48
49
for( int j = x1 ; j < x2 ; j++ )
{
50
for ( int k = y1 ; k < y2 ; k++ )
{
51
cake[j][k] += po(2,i);
52
}
53
}
54
}
55
for(int i = 0 ; i < w ; i++ )
56
for(int j = 0 ; j < h ; j++ )
57
if(used[j][i]==0)
{
58
now=cake[j][i];
59
dfs(j,i);
60
count++;
61
}
62
printf("%d\n",count);
63
}
64
return 0;
65
}
66
67