Return to problem list2017-1A Problem A
Final solution
func start() {
var t int
mustReadLineOfInts(&t)
for i := 0; i < t; i++ {
fmt.Fprintf(stdout, "Case #%d:\n", i+1)
test()
}
}
func test() {
var R, C int
mustReadLineOfInts(&R, &C)
cake := make([][]byte, R)
for r := 0; r < R; r++ {
readIn := mustReadLine()
row := make([]byte, C)
for c := 0; c < C; c++ {
row[c] = readIn[c]
}
cake[r] = row
}
var firstNonEmptyRow []byte = nil
rowIsEmpty := make([]bool, R)
for r := 0; r < R; r++ {
rowIsAllEmpty := true
row := cake[r]
var lastChar byte = '?'
var firstChar byte = '?'
for c := 0; c < C; c++ {
if row[c] == '?' {
row[c] = lastChar
continue
}
rowIsAllEmpty = false
if firstChar == '?' {
firstChar = row[c]
}
lastChar = row[c]
}
rowIsEmpty[r] = rowIsAllEmpty
if rowIsAllEmpty {
continue
}
for c := 0; c < C && row[c] == '?'; c++ {
row[c] = firstChar
}
if firstNonEmptyRow == nil {
firstNonEmptyRow = row
}
}
if firstNonEmptyRow == nil {
panic("All empty.")
}
lastNonEmptyRow := firstNonEmptyRow
for r := 0; r < R; r++ {
if rowIsEmpty[r] {
cake[r] = lastNonEmptyRow
} else {
lastNonEmptyRow = cake[r]
}
stdout.WriteString(string(cake[r]))
stdout.WriteByte('\n')
}
}
Sample test cases given in question
3
3 3
G??
?C?
??J
3 4
CODE
????
?JAM
2 2
CA
KE