讨论 / 615
余可2代 2011-04-19 22:35:00
点我顶贴 收藏 删除
615
#1 cjj1999@2011-04-19 22:32:00
回复 删除
#include <stdio.h>

//#include <assert.h>

const int maxn=2010;

char map[maxn][maxn];

int n,m;

int ans=0;

void init()

{

scanf("%d%d",&n,&m);

bool flag=0;

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

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

char t;

do

{

t=getchar() - '0';

}

while ( (t | 1) != 1);

flag |= (map[i][j] = t);

//assert(map[i][j]==0 || map[i][j]==1);

//putchar(map[i][j]+'0');

}

}

if (!flag) //1都没有

printf("0\n");

}

void work1()//找出最大的纯1矩阵

{

//横向的

ans=1;

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

int t1 = 0 , t2 = 0;

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

if (map[i][j]) ans >?= ++t1;

else t1 = 0;

if (map[i][j] && map[i+1][j]) ans >?= (t2 += 2);

else t2 = 0;

}

}

for (int i = 1 ; i <= m ; i++){

int t1 = 0 , t2 = 0;

for (int j = 1 ; j <= n ; j++){

if (map[j][i]) ans >?= ++t1;

else t1 = 0;

if (map[j][i] && map[j][i+1]) ans >?= (t2 += 2);

else t2 = 0;

}

}

//printf("ans = %d\n",ans);

}

bool used[maxn][maxn];

int max_row,max_column,min_row,min_column;

int sum;

void floodfill(int x, int y)

{

if (map[x][y] || used[x][y] || x > n || x < 1 || y > m || y < 1)

return;

sum++;

max_row >?= x;

min_row <?= x;

max_column >?= y;

min_column <?= y;

used[x][y] = 1;

floodfill(x, y+1);

floodfill(x, y-1);

floodfill(x-1, y);

floodfill(x+1, y);

}

void work0()

{

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

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

if (!map[i][j] && !used[i][j]){

sum = 0;

max_row = min_row = i;

max_column = min_column = j;

floodfill(i,j);

if (max_row < n && min_row > 1 &&

max_column < m && min_column > 1 &&

sum == (max_row - min_row + 1) * (max_column - min_column + 1) &&

map[max_row+1][max_column+1] && map[max_row+1][min_column-1] &&

map[min_row-1][max_column+1] && map[min_row-1][min_column-1])

ans >?= (max_row - min_row + 1 + 2) * (max_column - min_column + 1 + 2);

}

}

int main(int argc, char *argv[])

{

init();

work1();

work0();

printf("%d\n" , ans);

return 0;

}

#2 zhenghanle@2011-04-19 22:35:00
回复 删除
var

n,i:longint;

a:array[1..100]of longint;

procedure mk(i:longint);

var j,t:longint;flag:boolean;

begin

j:=i*2;

while j<=n do

begin

flag:=false;

if (j<n)and(a[j]>a[j+1]) then inc(j);

if a[i]>a[j] then

begin

t:=a[i];a[i]:=a[j];a[j]:=t;

i:=j;j:=j*2;

flag:=true;

end;

if not flag then exit;

end;

end;

begin

readln(n);

for i:=1 to n do

read(a[i]);

for i:=(n div 2) downto 1 do

mk(i);

for i:=1 to n do

begin

write(a[1],' ');

a[1]:=a[n];

dec(n);

mk(1);

end;

end.

查看更多回复
提交回复