Return to problem list

2017-1A Problem A

Final solution

cmd.go:
save   open on GitHub
// package, import, etc...

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')
	}
}

// boilerplate omitted...

Sample test cases given in question

sample.in:
save   open on GitHub
3
3 3
G??
?C?
??J
3 4
CODE
????
?JAM
2 2
CA
KE