Well I had to do this in Assembly for school ( and yes i would rather put my head through a pitchfork before attempting that again). The experience has taught me a few ways to go about this.
1st Way)
DFS (Depth First Search) is the algorithm that you would implement. this takes picks a state and chooses a value. based of that it picks the next neighbor and follows that to the end of the puzzle. If it finds a dead end, it will back up and try a different path. This algorithm is a fairly standard searching algorithm paired with BFS (searches differently). Assembly doesn't make it easy to implement this algorithm, but its a snap in higher level languages
2nd way) Taking the concept of the first you can start at pos(0,0) and give it a value of one. now move across row and increment its value by 1 at each step At this step check the column Was the input valid? if not keep incrementing until you try them all move back (explain below what that entails). do this to the end of the row. check the row for legitimacy, and if it isnt move back. What i mean by moving back, is to clear the pos you were at (back to 1) and then increment by 1 the pos you move to. This pattern will eventually fill up the table.
Special Conditions:fixed num: you will have to create a hopping method to jump over that going forward and back
move back at pos(0,0) this means that there were no solutions, and will have to report such when you encounter said event
move forward at pos(maxRow, maxCol): this means puzzle is solved.