Datatähti 2001: Loppukilpailu

Numeroristikko

Sanomalehdissä on joskus esiintynyt numeroristikoita, jossa esiintyy tuntemattomia numeroita edustavia kirjaimia, tunnettuja numeroita sekä sarakkeilla ja rivillä olevien numeroiden summia. Tällaisesta numeroristikosta pyydetään ratkaisemaan tuntemattomat numerot. Kuvassa 1 tuntemattomia numeroita edustavat kirjaimien sijaan sumbolit A1, A2, A3, ... (koska erilaisia kirjaimia on tavallisessa aakkostossa niin vähän).

A8 A2 A2 17
A1 A3 A4 11
A5 8 A1 14
5 A5 A5 15
A8 A6 A7 13
17 32 21

Kuva 1. 5 x 3-ristikko, jossa on 8 tuntematonta.

Ristikossa on tuntemattomista ja tunnetuista numeroista koostuvia rivejä x kappaletta ja kullakin rivillä on yhteenlaskettavia alkioita 3 kappaletta. Ristikossa esiintyy k tuntematonta, joita edustavat symbolit A1, A2, A3, ..., Ak. Kukin tuntematon esiintyy ristikossa vähintään kerran. Tunnettuja numeroita esiintyy rivi- ja sarakesummien lisäksi m kappaletta. Tuntemattomien edustamat numerot ovat aina keskenään erisuuria kokonaislukuja väliltä 1, ..., k . Tuntemattomat eivät voi esiintyä edustamassa rivillä olevien alkioiden summaa tai vastaavasti sarakkeella olevien alkioiden summaa.

Tehtävänäsi on tehdä ohjelma, joka määrittää arvot tuntemattomille. Jokaisella ohjelmallesi testivaiheessa annettavalla tehtävällä on vähintään yksi ratkaisu. Anna ohjelmallesi nimi NUMEROT.EXE (käyttöjärjestelmästä riippumatta).

Rajoitukset:

Syöttötiedoston muoto

Syöttötiedoston NUMEROT.IN ensimmäisellä rivillä ovat numerot x ja k (tässä järjestyksessä). Numerot eroitetaan toisistaan aina yhdellä blankko-merkillä. Kullakin seuraavasta x:stä rivistä on 4 kokonaislukua. Kunkin rivin viimeinen numero on kyseisellä rivillä olevien alkioiden summa. Muut numerot edustavat kyseisen rivin alkioita järjestyksessä. Huomaa, että rivillä oleva numero '2' voi tarkoittaa lukua 2 tai tuntematonta A2 -- se kummasta on kysymys kerrotaan myöhemmin tiedostossa.

Alkiorivien jälkeen tulee sarakesummien rivi, joka koostuu 3:sta kokonaisluvusta -- ensimmäinen vastaa vasemmanpuoleisimman (eli ensimmäisen) sarakkeen summaa ja viimeinen luku on oikeanpuoleisimman sarakkeen alkioiden summa.

Tämän jälkeen tiedostossa tulee rivi, jolla on yksi kokonaisluku m, joka on suurempi tai yhtä suuri kuin nolla. Lopuksi tulee m riviä, joilla kustakin on 2 kokonaislukua. Näiden rivien tarkoituksena on kertoa, milloin ristikon kohdassa (i,j) oleva kokonaisluku t edustaa tuntematonta At ja milloin itse kokonaislukua t. Kaikki ristikkoon laitetut alkiot edustavat tuntemattomia At-lukuja, paitsi ne, joiden koodinaatit luetellaan kyseisellä m:llä rivillä. Kullakin tällaisella rivillä oleva ensimmäinen luku tarkoitaa riviä (ja on siten välillä 1, ..., x) ja toinen luku tarkoittaa saraketta (ollen välillä 1, ..., 3).

Kaikki tiedostossa olevat luvut ovat ei-negatiivisia kokonaislukuja. Kuvan 1 mukainen syöttötiedosto on seuraavanlainen:

5 8
8 2 2 17
1 3 4 11
5 8 1 14
5 5 5 15
8 6 7 13
17 32 21
2
3 2
4 1

Tulostiedoston muoto

Tulostiedostoon NUMEROT.OUT kirjoitetaan arvot tuntemattomille. Tiedostoon tulee tulostaa yksi rivi, jolla on k kokonaislukua eroitettuna toisistaan yhdellä blankko-merkillä. Laita rivin loppuun rivin vaihtomerkki. Järjestyksessään i:s luku tarkoittaa tuntemattomalle Ai ratkaisussa annettavaa arvoa. Tehtävällä on aina vähintään yksi ratkaisu -- ohjelmasi saa tulostaa minkätahansa kelvollisista ratkaisuista. Esimerkiksi kuvan 1 tapauksessa eräs mahdollinen ratkaisu on seuraava.

1 7 8 2 5 4 6 3