POJ 2446 Chessboard 最大匹配

2022-05-05 05:45:10 字數 1573 閱讀 4780

昨天沒有搞出來,今天彙編課想出來了,發現還是水水的,昨天估計是受到前面兩題的影響,一直把思考方向搞錯了= =||。

題目要求用1*2的卡片覆蓋整個區域,而且要恰好完全覆蓋,不能有重疊。仔細發現,每個格仔要麼是被橫著的1*2的卡片覆蓋,要麼是豎著的覆蓋,而且每個只能和周圍上下左右的四個格仔同時覆蓋,那麼這裡就可以抽象出每個格仔和周圍四個格仔的匹配問題,就像西洋棋的黑白相間的格仔一樣。

例如(0可放,-1不可放):

0 -1  0            1  0  2      0  0  0

0  0  0        ——————>      0  3  0      1  0  2

0  0 -1            4  0  0      0  3  0

0  0  0            0  5  0      4  0  5

初始的棋盤           x集合                      y集合

那麼就是求x集合和y集合的最大匹配,如果最大匹配是完備匹配,那麼就是yes了,否則就是no。

1

//status:g++_ac_188ms_1660kb

2 #include3 #include4 #include

5 #include6 #include7 #include

8 #include9 #include10 #include11 #include12 #include13

using

namespace

std;

14#define ll long long

15#define max(a,b) ((a)>(b)?(a):(b))

16#define min(a,b) ((a)<(b)?(a):(b))

17#define mem(a,b) memset(a,b,sizeof(a))

18#define lson l,mid,rt<<1

19#define rson mid+1,r,rt<<1|1

20const

int max=35,inf=0x3f3f3f3f;21

22int dx[4]=,dy[4]=;

23int w[max*max>>1][max*max>>1],g[max][max],y[max*max],vis[max*max];

24int

n,m,k,coux,couy;

2526

void

getg()

2743}44

}45}46

}47}48

49int dfs(int

u)5059}

60}61return0;

62}6364

intmain()

6578

79if(!(k&1

))88}89

}90else ok=0;91

}92else ok=0;93

94 printf("

%s\n

",ok?"

yes":"no"

);95}96

return0;

97 }

poj 2446解題報告

題目大意 給你乙個棋盤,讓你用一些1 2的木塊覆蓋這個棋盤,但是棋盤上有些位置是有hole的,這些hole是不能被覆蓋的。如果可以覆蓋的話就輸出yes,否則輸出no。題目分析 這道題很容易讓人想起poj2411 也是一道很經典的題目 但是那道題是要求方案數目,這道題是求可否滿足,是完全不同的,一開始...

poj2446 Chessboard 最大匹配

題目大意 乙個n m的棋盤,某些格仔不能用,問用1 2的骨牌能否完全覆蓋這個棋盤,當然,骨牌不能有重疊 思路 顯然黑白染色後,乙個骨牌只能覆蓋乙個白色格仔和乙個黑色格仔,然後我們間二染色建圖,看能否有完美匹配即可tut include include include define maxn 1000...

POJ2446 二分匹配

題意 給你乙個n m的格仔,問你能不能用1 2的格仔把他鋪滿,有的位置是不能被鋪的。思路 水題,直接把個相鄰的並且都是可以鋪的點連一條邊然後匹配一遍就行了,提醒乙個地方,就是輸入不能鋪的座標的時候是 先輸入列再輸入行。include include define n node 1500 define...