kmjp's blog

競技プログラミング参加記です

Codeforces #569 Div1 B. Tolik and His Uncle

シンプルな問題設定。
https://codeforces.com/contest/1179/problem/B

問題

グリッドのサイズH*Wが与えられる。
今左上のセルに駒を置いておき、駒を全セル1回ずつ通るように移動させることを考える。
その際、移動前後の相対的な座標の差が、毎回異なるパターンとなるようなケースを構築せよ。

解法

中心に対し点対称を描くことを意識すると、同じパターンが2度現れない。
以下のコードでは、(1,1)(H,W)(2,1)(H-1,W)...(H,1)(1,W)(ここまで左端列と右端列を交互に動く)(1,2)(H,-1)...(端から2列目を左右交互に動く…)という感じで移動している。

int H,W;
void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>H>>W;
	int L=1,R=W;
	while(L<R) {
		for(y=1;y<=H;y++) {
			_P("%d %d\n",y,L);
			_P("%d %d\n",H+1-y,R);
		}
		L++;
		R--;
	}
	
	if(L==R) {
		x=L;
		L=1,R=H;
		while(L<R) {
			_P("%d %d\n",L,x);
			_P("%d %d\n",R,x);
			L++;
			R--;
		}
		
		if(L==R) _P("%d %d\n",L,x);
	}
	
}

まとめ

色んな解法がありそうね。