⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gataxx.x

📁 一个用自己写的编译器编译的操作系统内核. 有包含中断和不包含中断两个版本. 还有简单的用户应用程序。 因为该代码原目的是下载到硬件上使用
💻 X
字号:
void sys_putchar(char c)
{
	while (((*(int *)0x6003) & 1) == 0);
	*(int *)0x6002 = (int )c;
}


char sys_getchar()
{
	char ch;
	while (((*(int *)0x6003) & 2) == 0);
	ch = (char)((*(int *)0x6002) & 0xFF);
	return ch;
}


const int limit = 7;
const int black = 1;
const int white = 2;

int[8][2]* dir;

int[limit+2][limit+2] map, tmp, tmp2;
int fromx, fromy, x, y;

void init()
{
	dir = (int[8][2]*) <1, 0, 0, 1, 1, 1, 0xffff, 0, 0, 0xffff, 0xffff, 0xffff, 1, 0xffff, 0xffff, 1>;
	int i, j, a;
	for (i = 0; i <= limit + 1; i ++)
	{
		for (j = 0; j <= limit + 1; j ++)
		{
			map[i][j] = 0;
		}
	}
	for (i = 1; i <= limit; i ++)
	{
		for (j = 1; j <= limit; j ++)
		{
			char ch;
			while ((ch = sys_getchar()) != '0' && ch != '1' && ch != '2');
			map[i][j] = (int)(ch - '0');
		}
	}
}

int gtr0(int num)
{
	return (int)(!(num & 0x8000) && num);
}

int geq0(int num)
{
	return (int)!(num & 0x8000);
}

void getscore2(int x1, int y1, int x2, int y2, int* score)
{
	int q, i, j, max1, score1, k, p, x0, y0;
	max1 = 0;
	score1 = 0;
	for (i = 0; i <= limit + 1; i ++)
	{
		for (j = 0; j <= limit + 1; j ++)
		{
			tmp[i][j] = map[i][j];
		}
	}
	if (*score == 0) map[x1][y1] = 0;
	map[x2][y2] = black;
	for (j = 0; j < 8; j ++)
	{
		if (map[x2 + (*dir)[j][0]][y2 + (*dir)[j][1]] == white)
		{
			*score ++;
			map[x2 + (*dir)[j][0]][y2 + (*dir)[j][1]] = black;
		}
	}
	for (i = 1; i <= limit; i ++)
	{
		for (j = 1; j <= limit; j ++)
		{
			if (map[i][j] == white)
			{
				for (k = -2; k != 3; k ++)
				{
					for (p = -2; p != 3; p ++)
					{
						if (gtr0(k + i) && gtr0(j + p) && gtr0(8 - k - i) && gtr0(8 - p - j) && (k || p))
						{
							x0 = i + k; y0 = j + p;
							if (map[x0][y0] == 0)
							{
								if (geq0(1 - (x0 - i)) && geq0(x0 - i + 1) && geq0(1 - (y0 - j)) && geq0(y0 - j + 1))
								{
									score1 = 1;
								}
								else 
									score1 = 0;
								for (q = 0; q < 8; q ++)
								{
									if (map[(*dir)[q][0]+x0][(*dir)[q][1]+y0] == black) 
									{
										score1 ++;
									}
								}
								if (gtr0(score1 - max1)) 
								{
									max1 = score1;
								}
							}
						}
					}
				}
			}
		}
	}
	
	for (i = 0; i <= limit + 1; i ++)
	{
		for (j = 0; j <= limit + 1; j ++)
		{
			map[i][j] = tmp[i][j];
		}
	}
//	printf("%d %d***\n", max1, score);
	*score = *score - max1;
}

void main2()
{
	int max, score, k, p, i, j, x0, y0, q;
	max = -90;
	fromx = 0; fromy = 0; x = 0; y = 0;
	for (i = 0; i <= limit + 1; i ++)
		for (j = 0; j <= limit + 1; j ++)
			tmp2[i][j] = 0;
	for (i = 1; i <= limit; i ++)
	{
		for (j = 1; j <= limit; j ++)
		{
			if (map[i][j] == black)
			{
				for (k = -2; k != 3; k ++)
				{
					for (p = -2; p != 3; p ++)
					{
						if (gtr0(k + i) && gtr0(j + p) && gtr0(8 - k - i) && gtr0(8 - p - j) && (k || p))
						{
							x0 = i + k; y0 = j + p;
							if (map[x0][y0] == 0)
							{
								if (geq0(1 - (x0 - i)) && geq0(x0 - i + 1) && geq0(1 - (y0 - j)) && geq0(y0 - j + 1))
									score = 1;
								else 
								{
									score = 0;
									tmp [i][j] = 0;
								}
//								printf("%d\n", score);
								for (q = 0; q < 8; q ++)
								{
									if (map[(*dir)[q][0]+x0][(*dir)[q][1]+y0] == white) 
									{
										score ++;
									}
								}
								score = score << 3 + score << 1;
								if (gtr0(score - max))
								{
									tmp = map;
									if (geq0(1 - (x0 - i)) && geq0(x0 - i + 1) && geq0(1 - (y0 - j)) && geq0(y0 - j + 1))
										i = i;
									else 
									{
										tmp [i][j] = 0;
									}
									tmp[x0][y0] = black;
									for (q = 0; q < 8; q ++)
									{
										if (map[(*dir)[q][0]+x0][(*dir)[q][1]+y0] == white) 
										{
											tmp[(*dir)[q][0]+x0][(*dir)[q][1]+y0] = black;
										}
									}

									int a, b;
									for (a = 1; a <= limit; a ++)
										for (b = 1; b <= limit; b ++)
										{
											tmp2[a][b] = 0;
											if (tmp[a][b] == 0)
											{
												int xx, yy, dx, dy;
												xx = a;
												yy = b;
												int find;
												find = 0;
												for (dx = -2; dx != 3; dx ++)
													for (dy = -2; dy != 3; dy ++)
														if (gtr0(dx + xx) && gtr0(dy + yy) && gtr0(8 - dx - xx) && gtr0(y - dy - yy) && tmp[dx + xx][dy + yy] == white)
															{	find = 1; break; }
												if (find)
												{
													tmp2[a][b] = 1;
												}
											}
										}
									for (a = 1; a <= limit; a ++)
										for (b = 1; b <= limit; b ++)
											if (tmp[a][b] == black)
											{
												for (q = 0; q < 8; q ++)
													if (tmp2[(*dir)[q][0]+a][(*dir)[q][1]+b] == 1)
													{
														score = score - 5;
														break;
													}
											}
									if (gtr0(score - max))
									{
//										printf("%d %d %d %d %d\n", score, i, j, x0, y0);
										max = score;
										fromx = i; fromy = j;
										x = x0; y = y0;
									}
								}
							}
						}
					}
				}
			}
		}
	}
//	printf("%d\n", max);
}

void out()
{
	sys_putchar((char)(fromx + '0'));
	sys_putchar((char)(fromy + '0'));
	sys_putchar((char)(x + '0'));
	sys_putchar((char)(y + '0'));
}

void check()
{
	int i, j, q;
	q = 0;
	for (i = 1; i <= limit; i ++)
	{
		for (j = 1; j <= limit; j ++)
		{
			if (map[i][j] == 0) q ++;
		}
	}
	main2();
}

int main()
{
	while (sys_getchar() == '1')
	{
		init();
		check();
		out();
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -