논리 퍼즐

시간 제한1초메모리 제한512 MB

요약
변수 이름이 적힌 격자와 각 행과 열의 합이 주어질 때, 미지수가 하나뿐인 행이나 열을 반복해서 풀어 모든 변수의 정수 값을 구한다.
난이도

보통10점 중 4점

유형
시뮬레이션, 구현
정답자
아직 제출이 없습니다

문제

퍼즐 잡지에 흔히 나오는 논리 퍼즐이 있다. 격자의 각 칸에는 변수 이름이 하나씩 적혀 있고, 격자 오른쪽과 아래쪽에 적힌 수는 각각 그 행과 그 열에 있는 변수 값의 합이다.

행과 열의 합을 모두 만족하도록 각 변수의 값을 정하는 것이 이 퍼즐의 목표다. 아이들이 풀도록 만든 퍼즐이라 푸는 데 도움이 되는 성질이 하나 있다. 값이 아직 밝혀지지 않은 변수가 정확히 하나만 남은 행이나 열이 항상 있다. 그래서 한 단계마다 변수 하나의 값을 확정하는 방식으로 퍼즐을 끝까지 풀 수 있다.

퍼즐이 주어지면 각 변수의 값을 구하라.

입력

첫째 줄에 퍼즐의 행 수 LL과 열 수 CC가 주어진다 (1≤L≤1001 \le L \le 100, 1≤C≤1001 \le C \le 100). 이어지는 LL개 줄에는 각 줄마다 변수 이름 CC개와 정수 SS가 주어진다. SS는 그 행에 있는 변수 값의 합이다 (−108≤S≤108-10^8 \le S \le 10^8). 마지막 줄에는 정수 CC개가 주어지고, ii번째 정수 XiX_i는 ii번째 열에 있는 변수 값의 합이다 (−108≤Xi≤108-10^8 \le X_i \le 10^8).

변수 이름은 'a'부터 'z'까지의 소문자 두 개로 이루어진다. 같은 변수 이름이 여러 칸에 나올 수 있고, 그 값은 나온 횟수만큼 합에 더해진다. 모든 퍼즐은 해가 유일하며, 모든 변수 값은 −106-10^6 이상 10610^6 이하의 정수다.

출력

퍼즐에 나오는 변수마다 한 줄씩 출력한다. 각 줄에는 변수 이름과 그 정수 값을 공백으로 구분해 적는다. 변수는 알파벳 순서, 즉 aa, ab, ..., az, ba, bb, ..., za, zb, ..., zz 순서로 출력한다.

예제3

  1. 예제 1

    입력
    4 5
    df bb cg df df 11
    ee az cg az ee 6
    df cg cg df df 10
    az az cg az az 6
    6 7 8 6 6
    
    예상 출력
    az 1
    bb 3
    cg 2
    df 2
    ee 1
    
  2. 예제 2

    입력
    3 4
    aa bb cc dd 10
    aa bb cc dd 10
    aa bb cc dd 10
    3 6 9 12
    
    예상 출력
    aa 1
    bb 2
    cc 3
    dd 4
    
  3. 예제 3

    입력
    3 3
    aa zz aa 27
    vv zz aa -5
    kk kk aa 40
    15 -7 54
    
    예상 출력
    aa 18
    kk 11
    vv -14
    zz -9