I attempted to generate a blank crossword sheet. My method is by combining the rows and columns as shown on the graph below. However, some of the across and down numbers then appeared out of place after combining. What is the better way to obtain a blank crossword sheet?

fillRow[i_] := (
startPos = RandomInteger[{1, randomStartPos}] ;
randomWordLen = RandomInteger[{minWordLen, dimX - startPos}];
endPos = startPos + randomWordLen - 1;
Do[cwSheet[[i, n]] = 0, {n, startPos, endPos}];
AppendTo[ hintNumPad, { counter++, {startPos, dimX - i}}]
If[endPos <= dimX/2,
randomWordLen = RandomInteger[{minWordLen, dimX - endPos - 1}];
Do[cwSheet[[i, n]] = 0, {n, dimX, dimX - randomWordLen + 1, -1}];
AppendTo[
hintNumPad, { counter++, {dimX - randomWordLen + 1, dimX - i}}];
]
);
fillCol[j_] := (
startPos = RandomInteger[{1, randomStartPos}] ;
randomWordLen = RandomInteger[{minWordLen, dimY - startPos}];
endPos = startPos + randomWordLen - 1;
Do[cwSheet[[ n , j]] = 0, {n, startPos, endPos}];
AppendTo[ hintNumPad, { counter++, { j, dimY - startPos }}]
If[endPos <= dimX/2,
randomWordLen = RandomInteger[{minWordLen, dimX - endPos - 1}];
Do[cwSheet[[n, j]] = 0, {n, dimY, dimY - randomWordLen + 1, -1}];
AppendTo[ hintNumPad, { counter++, {j, randomWordLen - 1 }}];
]
);
minWordLen = 3;
hintNumPad = {};
{dimX, dimY} = {9, 9};
randomStartPos = 4;
Clear[cwSheet];
cwSheet = ConstantArray[1, {dimX, dimY}];
counter = 1;
Do[fillRow[k], {k, 1, dimY, 2}];
counter = 1;
Do[fillCol[k], {k, 1, dimX, 2}];
g = MatrixPlot[cwSheet , Mesh -> All,
Frame -> False,
ColorFunction -> "Monochrome",
Epilog -> {Text[Style[#[[1]], 9], #[[2]] + {-0.9, 0.8}] & /@
hintNumPad}]
The correct positions of the hint numbers should look like this:






