计算机走迷宫 C源码

计算机走迷宫 C源码

/*
 这个也是大一下学期写的
 当时不太会用结构体
 所以代码显得比较weak。。。
 后来说要做个改进
 一直也没有付诸实施
 */
#include<stdio.h>
#include<string.h>

int x[1000], y[1000], p[1000], m[1000], n[1000], *topm, *topn, *topx, *topy,
		*topp, *basem, *basen, *basex, *basey, *basep;
int l, r;
char a[100][100];

void Initstackx()
{
	topx = basex = x;
}
void Initstacky()
{
	topy = basey = y;
}
void Initstackp()
{
	topp = basep = p;
}

void Initstackm()
{
	topm = basem = m;
}
void Initstackn()
{
	topn = basen = n;
}

int stackemptyx()
{
	if (topx == basex)
		return (1);
	else
		return (0);
}
int stackemptyy()
{
	if (topy == basey)
		return (1);
	else
		return (0);
}
int stackemptyp()
{
	if (topp == basep)
		return (1);
	else
		return (0);
}

int* gettopx()
{
	return (topx);
}
int* gettopy()
{
	return (topy);
}
int* gettopp()
{
	return (topp);
}

int* popx()
{
	topx--;
	return (topx + 1);
}
int* popy()
{
	topy--;
	return (topy + 1);
}
int* popp()
{
	topp--;
	return (topp + 1);
}

void pushx(int pos)
{
	topx++;
	*topx = pos;
}
void pushy(int pos)
{
	topy++;
	*topy = pos;
}
void pushp(int pos)
{
	topp++;
	*topp = pos;
}

void pushm(int pos)
{
	topm++;
	*topm = pos;                                                         //
}
void pushn(int pos)
{
	topn++;
	*topn = pos;
}

int check(int i, int j)
{
	int *p1, *p2;
	p1 = basem + 1;
	p2 = basen + 1;
	while (p1 <= topm)
	{
		if (*p1 == i && *p2 == j)
			return (1);
		else
		{
			p1++;
			p2++;
		}
	}
	return (0);
}
int rout(int i, int j, int pos)
{
	switch (pos)
	{
	case 0:
		if (a[i][j + 1] != '#' && j + 1 < l && check(i, j + 1) != 1)
			return (1);
		else if (a[i + 1][j] != '#' && i + 1 < r && check(i + 1, j) != 1)
			return (2);
		else if (a[i][j - 1] != '#' && j - 1 >= 0 && check(i, j - 1) != 1)
			return (3);
		else if (a[i - 1][j] != '#' && i - 1 >= 0 && check(i - 1, j) != 1)
			return (4);
		else
			return (0);
	case 1:
		if (a[i + 1][j] != '#' && i + 1 < r && check(i + 1, j) != 1)
			return (2);
		else if (a[i][j - 1] != '#' && j - 1 >= 0 && check(i, j - 1) != 1)
			return (3);
		else if (a[i - 1][j] != '#' && i - 1 >= 0 && check(i - 1, j) != 1)
			return (4);
		else
			return (0);
	case 2:
		if (a[i][j + 1] != '#' && j + 1 < l && check(i, j + 1) != 1)
			return (1);
		else if (a[i][j - 1] != '#' && j - 1 >= 0 && check(i, j - 1) != 1)
			return (3);
		else if (a[i - 1][j] != '#' && i - 1 >= 0 && check(i - 1, j) != 1)
			return (4);
		else
			return (0);
	case 3:
		if (a[i][j + 1] != '#' && j + 1 < l && check(i, j + 1) != 1)
			return (1);
		else if (a[i + 1][j] != '#' && i + 1 < r && check(i + 1, j) != 1)
			return (2);
		else if (a[i - 1][j] != '#' && i - 1 >= 0 && check(i - 1, j) != 1)
			return (4);
		else
			return (0);
	case 4:
		if (a[i][j + 1] != '#' && j + 1 < l && check(i, j + 1) != 1)
			return (1);
		else if (a[i + 1][j] != '#' && i + 1 < r && check(i + 1, j) != 1)
			return (2);
		else if (a[i][j - 1] != '#' && j - 1 >= 0 && check(i, j - 1) != 1)
			return (3);
		else
			return (0);
	}
}

int main()
{
	puts(
			"**********************************************************************");
	puts(
			"*                                                                    *");
	puts("*                走              迷             宫                   *");
	puts(
			"*                                                                    *");
	puts("*                       软件2班      王凯旋                          *");
	puts(
			"**********************************************************************\n\n");
	puts("说明:1 . 以'#'代表墙,空格代表可走区域");
	puts("      2 . 可走任意阶迷宫,'CTRL + Z'代表输入结束");
	puts("      3 . 不必输入边框");
	int i, j, t;
	begin: Initstackx();
	Initstacky();
	Initstackp();
	Initstackm();
	Initstackn();
	gets(a[0]);
	if ((l = strlen(a[0])) == 0)
	{
		printf("您没有输入迷宫\n请输入迷宫:\n");
		goto begin;
	}
	r = 1;
	while (gets(a[r]))
		r++;                              //得到迷宫
	i = 0;
	j = 0;
	while (1)
	{
		pushm(i);
		pushn(j);
		if (i == r - 1 && j == l - 1)
		{                          //到出口位置跳出
			if (a[i][j] == '#')
				goto out;
			else
				goto output;
		}
		if ((t = rout(i, j, 0)) > 0)                        //当前位置可通     t为可通方向
		{
			pushx(i);
			pushy(j);
			pushp(t);                                    //路径进栈
			switch (t)
			//切换下一个位置为当前位置
			{
			case 1:
				j++;
				break;
			case 2:
				i++;
				break;
			case 3:
				j--;
				break;
			case 4:
				i--;
				break;
			}
		}
		else                                            //当前位置不可通
		{
			if ((!stackemptyx())
					&& ((t = rout(*gettopx(), *gettopy(), *gettopp()) > 0))) //栈不空且上一个位置还有其他路径可走
			{
				popp();
				pushp(t);                         //压入新位置
				switch (t)
				//切换到下一个当前位置
				{
				case 1:
					j++;
					break;
				case 2:
					i++;
					break;
				case 3:
					j--;
					break;
				case 4:
					i--;
					break;
				}
			}
			else
			{
				while ((!stackemptyx())
						&& ((t = rout(*gettopx(), *gettopy(), *gettopp())) == 0)) //当栈不空且当前位置无其他路可走
				{
					popx();
					popy();
					popp();
					i = *gettopx();
					j = *gettopy();
				}                          //弹出当前位置
				if (stackemptyx())               //若栈空,跳出
					goto out;
				else                               //否则切换下一个当前位置
				{
					popp();
					pushp(t);                        //压入新位置
					switch (t)
					//切换到下一个当前位置
					{
					case 1:
						j++;
						break;
					case 2:
						i++;
						break;
					case 3:
						j--;
						break;
					case 4:
						i--;
						break;
					}
				}
			}
		}
	}
	out: if (stackemptyx())
	{
		puts("No solution!\n");
		goto begin;
	}
	output: putchar(10);
	while (!stackemptyx())
	{
		a[*popx()][*popy()] = '.';
	}
	a[r - 1][l - 1] = '.';
	for (i = 0; i < l + 2; i++)
		printf("0");
	printf("\n");
	for (i = 0; i < r; i++)
	{
		printf("0");
		for (j = 0; j < l; j++)
			printf("%c", a[i][j]);
		printf("0\n");
	}
	for (i = 0; i < l + 2; i++)
		printf("0");
	printf("\n");
	goto begin;
}

发表回复