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

UVa11124 Troubles for Modern Days Problemsetters

問題
http://uva.onlinejudge.org/external/111/11124.html

概要
奇数段目かつ奇数番目のブロックのみの数字が書かれた積み石がある。最下段の数字以外はパスカルの三角形同様の方式で値が決まるので、全ての数字を特定し出力せよ。

解法
積み石の一般の位置において、関係式を立式するだけ。

#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
 
ll block[9][9];

void completePascal() {
   
  for(int i=0; i<4; i++) {
    for(int j=0; j<i*2+1; j++) {
      if(j%2) continue;
      int c = block[i*2][j];
      int a = block[i*2+2][j];
      int b = block[i*2+2][j+2];
      int C = (c - a - b)/2;
      int A = a+C, B = b+C;
      
      block[i*2+2][j+1] = C;
      block[i*2+1][j] = A, block[i*2+1][j+1] = B;
    }
  }
   
}
 
int main() {
   
  int Tc; cin >> Tc;
   
  while(Tc--) {
    memset(block, 0, sizeof block);
    for(int i=0; i<9; i++) {
      if(i%2) continue;
      for(int j=0; j<i+1; j++) {
        if(j%2) continue;
        cin >> block[i][j];
      }
    }
     
    completePascal();
     
    for(int i=0; i<9; i++) {
      for(int j=0; j<i+1; j++) {
	if(j) cout << " " << block[i][j];
	else cout << block[i][j];
      }
      cout << endl;
    }
  }
  
  return 0;
}