呵呵,這個(gè)題目做出來時(shí)候很開心,因?yàn)橛玫搅艘粋€(gè)小技巧,就是標(biāo)記格子時(shí)候用2進(jìn)制的變化規(guī)則來存儲(chǔ),這樣絕不會(huì)出現(xiàn)重復(fù),而這個(gè)數(shù)字最大是2^50,所以要用GCC/G++的long long型C/C++的__int64來存儲(chǔ)。呵呵,這樣做就只需要判格子即可不需要判邊,最后一個(gè)DFS查數(shù)量就AC了,但是這是數(shù)據(jù)量范圍決定的,>64的就沒法這樣做了~注意輸入數(shù)字的大小順序和自己的程序不符的時(shí)候要判斷并互換才可以。
附上AC代碼,呵呵,blog建立到現(xiàn)在有好幾十的閱讀量了,很高興。我在ACM上還是個(gè)最菜的級(jí)別~希望能通過這個(gè)Blog堅(jiān)持下去,并與大家交流得以提高&&認(rèn)識(shí)些朋友~呵呵,希望大家留個(gè)言哈``
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