【構造】Codeforces Round #480 (Div. 2) B. Marlin

題意:給你一個4*n的網格,保證n爲奇數,讓你在其中放k個障礙物,不能放在邊界的格子上,使得從左上角走到右下角的最短路的方案數,剛好等於從左下角走到右上角的最短路的方案數。spa

k爲偶數時,以縱向爲對稱軸進行擺放便可。blog

k爲奇數且小於等於n-2時,以下圖橫向對稱擺放:io

...........
...........
...#####...
...........class

k等於n時,以下圖:di

.............
.#.........#.
.###########.
.............return

k大於n時,在上圖空閒的位置隨便填便可。

#include<cstdio>
using namespace std;
int n,K;
char a[6][105];
int main(){
	scanf("%d%d",&n,&K);
	for(int i=1;i<=4;++i){
		for(int j=1;j<=n;++j){
			a[i][j]='.';
		}
	}
	puts("YES");
	if(K%2==0){
		K/=2;
		for(int i=1;i<=K;++i){
			a[2][i+1]=a[3][i+1]='#';
		}
	}
	else{
		if(n==1){
			a[2][2]='#';
		}
		else if(K<=n-2){
			for(int i=1,j=(n-K)/2+1;i<=K;++i,++j){
				a[3][j]='#';
			}
		}
		else if(K==n){
			for(int i=1,j=2;i<=n-2;++i,++j){
				a[3][j]='#';
			}
			a[2][2]=a[2][n-1]='#';
		}
		else{
			for(int i=1,j=2;i<=n-2;++i,++j){
				a[3][j]='#';
			}
			a[2][2]=a[2][n-1]='#';
			for(int i=3,j=1;i<=n-2 && j<=K-n;++i,++j){
				a[2][i]='#';
			}
		}
	}
	for(int i=1;i<=4;++i){
		for(int j=1;j<=n;++j){
			putchar(a[i][j]);
		}
		puts("");
	}
	return 0;
}
相關文章
相關標籤/搜索