昨天沒有搞出來,今天彙編課想出來了,發現還是水水的,昨天估計是受到前面兩題的影響,一直把思考方向搞錯了= =||。
題目要求用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...