Problem 1117 : Missing Numbers
問題概要
? ? 70 105 ? 50 ? 150 30 60 90 180 45 150 240 435
のように、h行w列の表および、それぞれの行・列の合計値が与えられる。
表の中にはいくつか'?'が書かれている。
合計値に合うように'?'の値を決められるならばその値を対応する'?'の出現した順に、決められないならば"NG"を出力せよ。
'?'が行・列の合計値の欄に現れることはない。
解法
Respect2Dさんの日記を参考にした。
?が一つだけの行・列を探し、'?'を一つずつ確定させて行くとよいらしい。
ソースコード
int h,w,d[100][100]; int nq,q[100][100]; int main() { bool fst=1; while(scanf("%d",&h),h) { scanf("%d",&w); w++; h++; nq=0; rep(i,h)rep(j,w) { char in[9]; scanf("%s",in); if(in[0]=='?')d[i][j]=inf,q[i][j]=1,nq++; else d[i][j]=atoi(in),q[i][j]=0; } bool f=0; while(nq&&!f) { f=1; rep(i,h-1) { int p=-1,sum=0; rep(j,w-1) { if(d[i][j]==inf)p=p==-1?j:-2; else sum+=d[i][j]; } if(p>=0) { d[i][p]=d[i][w-1]-sum; nq--; f=0; goto NEXT; } } rep(j,w-1) { int p=-1,sum=0; rep(i,h-1) { if(d[i][j]==inf)p=p==-1?i:-2; else sum+=d[i][j]; } if(p>=0) { d[p][j]=d[h-1][j]-sum; nq--; f=0; goto NEXT; } } NEXT:; } if(!fst)puts(""); else fst=0; if(nq)puts("NO"); else rep(i,h)rep(j,w)if(q[i][j])printf("%d\n",d[i][j]); } return 0; }