AOJ 0141 - Spiral Pattern

n=2だけ特別視

#include<iostream>
#include<algorithm>
#include<cstdio>

int main(){
	const int MAX_N = 100;
	const int dx[] = {0, 1, 0, -1}, dy[] = {-1, 0, 1, 0};
	int d, n;

	std::cin >> d;
	for(int k=0;k<d;k++){
		std::cin >> n;

		if(k > 0){
			std::cout << std::endl;
		}

		if(n == 2){
			std::cout << "##\n# \n";
		}else{
			int x = 0, y = n-1, p = n-3, angle = 0;

			int cloth[MAX_N][MAX_N];
			for(int i=0;i<n;i++){
				std::fill(cloth[i], cloth[i]+n, 0);
			}
			
			for(int i=0;i<3;i++){
				cloth[y][x] = 1;
				for(int j=0;j<n-1;j++){
					x += dx[angle];
					y += dy[angle];
					cloth[y][x] = 1;
				}
				angle = (angle + 1) % 4;
			}
			
			while(p > 1){
				for(int i=0;i<2;i++){
					cloth[y][x] = 1;
					for(int j=0;j<p;j++){
						x += dx[angle];
						y += dy[angle];
						cloth[y][x] = 1;
					}
					angle = (angle + 1) % 4;						
				}
				p -= 2;
			}
			
			if(n % 2 == 0){//偶数
				x += dx[angle];
				y += dy[angle];
				cloth[y][x] = 1;
			}
			
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					if(cloth[i][j]){
						printf("#");
					}else{
						printf(" ");
					}
				}
				std::cout << std::endl;
			}
		}
	}
}