#include <stdio.h>
#include <stdlib.h>

typedef unsigned short bitset;

void print(bitset);

const char cresult[] = {'<', '=', '>', 0};

#define ROW_SIZE 4

inline void setvalue(bitset * set, int position, int value)
{
	bitset _set = *set;
	_set = _set | ((value == 9 ? 1 : 0) << position);
	*set = _set;
}

inline int getvalue(bitset set, int position)
{
	int v = (set) & ((1 << position));
	return v ? 9 : 1;
}

inline int getrowvalue(bitset set, int row)
{
	int i = 0;
	int k = 0;
	for(i = 0; i < ROW_SIZE ; i++)
	{
		k = k * 10 + getvalue(set, row * ROW_SIZE + i);
	}
	return k;
}

inline int getcolvalue(bitset set, int col)
{
	int i = 0;
	int k = 0;
	for(i = 0; i < ROW_SIZE ; i++)
	{
		k = k * 10 + getvalue(set, i * ROW_SIZE + col);
	}
	return k;
}

inline int compare(int val1, int val2)
{
	return (val1 > val2) ? 1 : (val1 < val2) ? -1 : 0;
}


int validate(bitset set, int * rowconstraints, int * columnconstraints)
{
	int i, j;
	for(i = 0; i < ROW_SIZE; i++)
	{
		for(j = 0; j < ROW_SIZE; j++)
		{
			if(i == j) continue;
			if(compare(getrowvalue(set, i), getrowvalue(set, j)) !=
				compare(rowconstraints[i], rowconstraints[j]))
			{
				/* printf("exit at row %d:%d\n",
							i, j);*/
				return 0;
			}
			if(compare(getcolvalue(set, i), getcolvalue(set, j)) !=
				compare(columnconstraints[i], columnconstraints[j]))
			{
				/* printf("exit at col %d:%d\n",
							i, j);*/
				return 0;
			}
		}
		//print(set);
	}

	return 1;
}

void print(bitset set)
{
	int i = 0;
	int j = 0;

	for(i = 0; i < ROW_SIZE; i++)
	{
		for(j = 0; j < ROW_SIZE; j++)
		{
			printf("%d ", getvalue(set, i * ROW_SIZE + j));
		}
		printf("\n");
	}
	printf("------------\n");
}

int main()
{
	bitset b = 0;
	int i, j;

	int columnconstraints[] = { 3, 7, 6, 4 };
	int rowconstraints[] = { 5, 2, 8, 1};

	while(1) 
	{
		if(validate(b, rowconstraints, columnconstraints))
		{
			print(b);
		}
		/* exit when overflow */
		if(b == 65535) break;
		b++;
	}
	
/*	
	b = 0;
	for(i = 0; i < 16; i++)
	{
		setvalue(&b, i, 9);
	}
	print(b);
	setvalue(&b, 0, 1);
	setvalue(&b, 4, 9);
	setvalue(&b, 8, 1);
	setvalue(&b, 12, 9);
	
	printf("%d\n", getcolvalue(b, 0));
*/
}
