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

#define	MAXLINES	(1024*1024)

int	line[MAXLINES][4];
int	linesp = 0;
int	modval;

int
mkval(int y)
{
	/* Make a unique x or y value (on y=0 or 1) */
	register int i = rand() % modval;
	register int j;

	for (j=0; j<linesp; ++j) {
		if (line[j][y] == i) {
			i = rand() % modval;
			j = -1;
		}
	}
	return(i);
}

main(int argc, char **argv)
{
	register int i, j, lines, seed;

	if (argc != 3) {
		fprintf(stderr,
			"Usage: %s seed total_lines\n"
			"-seed lists solution order\n",
			argv[0]);
		exit(1);
	}

	seed = atoi(argv[1]);
	lines = atoi(argv[2]);
	if (lines < 3) lines = 3;
	if (lines >= MAXLINES) lines = MAXLINES;
	modval = 10;
	while (modval < lines) modval *= 10;

	/* Create random lines */
	srand((seed > 0) ? seed : -seed);
	line[0][2] = line[0][0] = mkval(0);
	line[0][3] = line[0][1] = mkval(1);
	linesp = 1;
	while (linesp <= lines) {
		register int t;
		line[linesp][0] = line[linesp-1][2];
		line[linesp][1] = line[linesp-1][3];
		line[linesp][2] = mkval(0);
		line[linesp][3] = mkval(1);
		++linesp;
	}

	/* Scramble them */
	if (seed < 0)
	for (i=1; i<=lines; ++i) {
		/* Swap with somebody else */
		do {
			j = (rand() % lines) + 1;
		} while (i == j);
		memcpy(&(line[0][0]), &(line[j][0]), 4*sizeof(line[0][0]));
		memcpy(&(line[j][0]), &(line[i][0]), 4*sizeof(line[0][0]));

		/* Optionally flip line direction */
		if (rand() & 0x1000) {
			memcpy(&(line[i][0]), &(line[0][0]), 4*sizeof(line[0][0]));
		} else {
			line[i][0] = line[0][2];
			line[i][1] = line[0][3];
			line[i][2] = line[0][0];
			line[i][3] = line[0][1];
		}
	}

	/* Print 'em out */
	for (i=1; i<=lines; ++i) {
		printf("%d %d %d %d\n",
		       line[i][0],
		       line[i][1],
		       line[i][2],
		       line[i][3]);
	}

	exit(0);
}
