懸線法 棋盤製作

2021-06-05 19:56:53 字數 1594 閱讀 3836

description

西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋、象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8*8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是他跟他的好朋友小w決定將棋盤擴大以適應他們的新規則。小q找到了一張由n*m個正方形的格仔組成的矩形紙片,每個格仔被塗有黑白兩種顏色之一。小q想在這種紙中裁減一部分作為新棋盤,當然,他希望這個棋盤盡可能的大。不過小q還沒有決定是找乙個正方形的棋盤還是乙個矩形的棋盤(當然,不管哪種,棋盤必須都黑白相間,即相鄰的格仔不同色),所以他希望可以找到最大的正方形棋盤面積和最大的矩形棋盤面積,從而決定哪個更好一些。於是小q找到了即將參加全國資訊學競賽的你,你能幫助他麼?

input

第一行包含兩個整數n和m,分別表示矩形紙片的長和寬。接下來的n行包含乙個n * m的01矩陣,表示這張矩形紙片的顏色(0表示白色,1表示黑色)。

output

包含兩行,每行包含乙個整數。第一行為可以找到的最大正方形棋盤的面積,第二行為可以找到的最大矩形棋盤的面積(注意正方形和矩形是可以相交或者包含的)。

sample input

3 31 0 1

0 1 0

1 0 0

sample output46

hint

對於20%的資料,n, m ≤ 80

對於40%的資料,n, m ≤ 400

對於100%的資料,n, m ≤ 2000

棋盤的01建模。首先構造出乙個和給定棋盤尺寸相同的「標準棋盤」即01交叉的棋盤,然後將給定棋盤中所有標準棋盤上1所對應位置的顏色全部反轉,求一次極大子矩形和極大子正方形。最後再將整個棋盤反轉,再求一次,取兩次的較大值即可。

accode:

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

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

const int maxn = 2010;

bool mp[maxn][maxn];

int h[maxn], l[maxn], r[maxn];

int maxl[2][maxn], maxr[2][maxn];

int n, m, sq, rec;

inline void calc()

for (int j = m; j > 0; --j)

if (!mp[i][j])

r[j] = j - 1, maxr[ths][j] = m;

else

}return;

}int main()

calc();

for (int i = 1; i < n + 1; ++i)

for (int j = 1; j < m + 1; ++j)

mp[i][j] ^= 1;

calc();

printf("%d\n%d\n", sq, rec);

return 0;

}

洛谷1169 棋盤製作(懸線法)

懸線法 用於解決給定矩陣滿足條件的最大子矩陣。做法 用一條線 橫豎都行 左右移動直到不滿足約束條件或者到達邊界。定義 left i,j 表示 i,j 向左擴充套件能夠到達的最左邊的位置。right i,j 表示 i,j 向右擴充套件能夠到達的最右邊的位置。up i,j 表示 i,j 向上能夠拓展的最...

ZJOI2007 棋盤製作 懸線法

在乙個 n times m 的 0 1 矩陣中,求面積最大的相鄰位置數字不同的矩形和正方形。乍一看,也許暴力可以解決問題,可以暴力的列舉所取圖形的長和寬,然後再暴力的列舉。但是這樣的時間複雜度高達 o n 2 m 2 肯定行不通,而且很難寫。這時候,我們引入 懸線法 對於每個位置,我們預處理出此節點...

P1169 ZJOI2007 棋盤製作(懸線法)

題目描述 西洋棋是世界上最古老的博弈遊戲之一,和中國的圍棋 象棋以及日本的將棋同享盛名。據說西洋棋起源於易經的思想,棋盤是乙個8 times 88 8大小的黑白相間的方陣,對應八八六十四卦,黑白對應陰陽。而我們的主人公小q,正是西洋棋的狂熱愛好者。作為乙個頂尖高手,他已不滿足於普通的棋盤與規則,於是...