SRM 452 DIV1 Easy - NotTwo ○

問題


H*Wの大きさである2次元の座標があり、そこにできるだけ多くの
石を置きたい。

ただし、それぞれの石の距離についてユークリッド距離が2にならないようにしたい。

このとき、最も多くおける石の個数を求める。

解き方


ユークリッド距離が2になりうるセルについて、4つの区間に分けることができる。

この区間はそれぞれどのような石の置かれ方をされてもユークリッド距離が
2になることはない。

あとは、各区間について置ける最大の石の個数を求めればよい。
区間中のセルの数をDFSで求め、その(セルの数+1)/2が
置くことができる最大の石の個数となる。

コード


int used[1010][1010];
int dr[]={2,0,-2,0},dc[]={0,2,0,-2};
int w,h,cnt;

class NotTwo {

public:

void dfs(int r,int c){
used[r][c]=1;
cnt++;
FORE(i,0,4){
int nr=r+dr[i],nc=c+dc[i];
if(0<=nr && nr<h && 0<=nc && nc<w && !used[nr][nc]){
dfs(nr,nc);
}
}
}

int maxStones(int width, int height) {
int ret=0;
w=width,h=height;

memset(used,0,sizeof(used));
FORE(i,0,height)FORE(j,0,width)if(used[i][j]==0){
cnt=0;
dfs(i,j);
ret+=(cnt+1)/2;
}

return ret;
}

};

Share this

Related Posts

Previous
Next Post »