日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 2483

發(fā)布時(shí)間:2023/12/19 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 2483 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

地址:http://acm.hdu.edu.cn/showproblem.php?pid=2483

題意:給一個(gè)n*m的0-1矩陣。在里面找符合條件的方陣。條件有3個(gè):1.方陣的4條邊上全為1;2.方陣內(nèi)(除了4條邊的)0和1的個(gè)數(shù)之差不超過1;3.方陣大小至少為2*2。問能找到幾個(gè)這樣的方針。

mark:最樸素的做法是枚舉所有的1當(dāng)做要找的方陣左上角的元素。然后判斷四邊是否全為1,再統(tǒng)計(jì)內(nèi)部0和1的個(gè)數(shù)。但是每次判斷邊上的1和計(jì)算內(nèi)部1的數(shù)量復(fù)雜度太高,肯定是不行的。

我們用一個(gè)數(shù)組sum[i][j]表示從矩形左上角到(i,j)這個(gè)位置里1的個(gè)數(shù)。在計(jì)算區(qū)域內(nèi)1的個(gè)數(shù)的時(shí)候可以利用這個(gè)sum[i][j]數(shù)組得到。sum[i][j]需要預(yù)處理出來:sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+g[i][j]。

我們用一個(gè)數(shù)組row[i][j]表示第i行中第j個(gè)元素是“連續(xù)的第幾個(gè)1”。例如111011對應(yīng)的row[i]就是123012。判斷橫邊是否是連續(xù)的1的時(shí)候,可以用row[i][right]-row[i][left-1]的結(jié)果和right-left比較,相同則全為1。row數(shù)組需要預(yù)處理出來:row[i][j] = (g[i][j]?row[i][j-1]+1:0);

豎邊也是這樣預(yù)處理出來。

這樣判斷一個(gè)給定的方陣是否符合要求,只需要利用上面3個(gè)輔助數(shù)組,O(1)地完成,復(fù)雜可以符合要求了。

?

代碼:

1 # include <stdio.h> 2 # include <string.h> 3 4 5 int g[310][310] ; 6 int sum[310][310] ; 7 int row[310][310], col[310][310] ; 8 int n, m ; 9 10 11 int abs(int x){return x<0?-x:x;} 12 13 14 int check(int x, int y, int xx, int yy) 15 { 16 int _1 = sum[xx-1][yy-1]-sum[xx-1][y]-sum[x][yy-1]+sum[x][y] ; 17 int _0 = (xx-x-1)*(yy-y-1) - _1 ; 18 if (abs( _1 - _0) > 1) return 0 ; 19 if (row[x][yy] - row[x][y] != yy-y) return 0 ; 20 if (row[xx][yy]-row[xx][y] != yy-y) return 0 ; 21 if (col[xx][y] - col[x][y] != xx-x) return 0 ; 22 if (col[xx][yy] - col[x][yy] != xx-x) return 0 ; 23 return 1 ; 24 } 25 26 27 int main () 28 { 29 int T ; 30 int i, j, k ; 31 int l, t, r, d, ans ; 32 int flag ; 33 34 scanf ("%d", &T) ; 35 while (T--) 36 { 37 scanf ("%d%d", &n, &m) ; 38 for (i = 1 ; i <= n ; i++) 39 for (j = 1 ; j <= m ; j++) 40 scanf ("%d", &g[i][j]), 41 sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+g[i][j], 42 row[i][j] = ((g[i][j])?(row[i][j-1]+1):0), 43 col[i][j] = ((g[i][j])?(col[i-1][j]+1):0) ; 44 ans = 0 ; 45 for (i = 1 ; i <= n ; i++) 46 for (j = 1 ; j <= m ; j++) if (g[i][j]) 47 for (k = 1 ; i+k<=n && j+k<=m ; k++) 48 if (check(i,j,i+k,j+k)) ans++ ; 49 printf ("%d\n", ans) ; 50 } 51 return 0 ; 52 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/lzsz1212/archive/2013/05/17/3083768.html

總結(jié)

以上是生活随笔為你收集整理的hdu 2483的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。