薄いブログ

技術の雑多なことを書く場所

渦巻き生成ってめんどくさい

どうも、72日ぶりの更新の@orisanoです。

渦巻き生成っていざコードに落とそうと思うとめんどくさいって思いました。
(ICPCのD問題を見た感想)

なので、てきとーに関数を作っておけばいいと思ったので作りました(てきとー

可読性もひったくれも無いコード。

int make_spiral(int *m, int s, int n, int hour, int is_cw)
{
	int x, y;
	int c, l, v, i;
	int t[] = {0, -1, 0, 1, 0, -1, 0, 1};
	int *d = t + (hour / 3 % 4 + 4 & 3);

	n & 1 || n++;
	x = y = n / 2;
	c = l = v = 0;
	n *= n;

	for (m[y * s + x] = ++c; c < n; v &= 3){
		for (i = 0; i < l; i++){
			x += d[v + 1];
			y += d[v] * (is_cw ? 1 : -1);
			m[y * s + x] = ++c;
		}
		if (++v & 1) l++;
	}
	return (0);
}

試しに使ってみたのがこれです。http://ideone.com/zDWAgk

コメントはめんどくさかったので書きませんでした。察してください。
あと回転が始まる方向は時計の針の方向を採用しました。
3時、6時、9時、12時の方向が選べるはず、それが引数のhourですね。

久々の更新が適当ですいません。