読者です 読者をやめる 読者になる 読者になる

LiveArchive4403 ASCII Diamondi

解説
描画する文字の位置に対応する文字を探してやれば、描画する長方形の範囲の計算量 40000 × テストケース 125 で解ける。

#include <bits/stdc++.h>
 
using namespace std;
 
#define SIZE_N (2*N-1)
 
char change(int x, int y, int N) {
  int ax = N, ay = N;
  x %= SIZE_N;
  y %= SIZE_N;
  x = max(x, SIZE_N-x-1);
  y = max(y, SIZE_N-y-1);
  if((x+1-ax)+(y+1-ay) >= N) return '.';
  return ((x+1+y+1)%N) % 26 + 'a';
}
 
int main() {
   
  int N, y1, x1, y2, x2;
  int Tcnt = 1;
  while(cin >> N >> y1 >> x1 >> y2 >> x2) {
    if(N == 0) break;
    cout << "Case " << Tcnt++ << ":\n";
    for(int Y=y1; Y<=y2; Y++) {
      for(int X=x1; X<=x2; X++) {
        printf("%c", change(X, Y, N));
      }
      puts("");
    }
  }
     
  return 0;
}