Cy语言九宫格

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

#define NAMESIZE 20
#define TRUE 1
#define FLASE 0
//#define EqualFun strcmp
//#define SetValue strcpy
#define MAXSIZE 3 //三个元素
#define ZERO 0 //代表空格
typedef int NODE[MAXSIZE][MAXSIZE]; //图中节点为二维数组
typedef int STATUS;
typedef struct NEIGHBORNODE
{
NODE name;
struct NEIGHBORNODE* next;
}*NEIGHBOR, *PATH;

typedef struct ANODE
{
NODE name;
NEIGHBOR adjacents;
}ANYNODE;

typedef struct GRAPHNODE
{
ANYNODE node;
struct GRAPHNODE* next;
}*GRAPH;

typedef struct PATHS
{
PATH path;
struct PATHS* next;
}*PSTACK, * PATHSET;

NEIGHBOR AddNeibor(NEIGHBOR nb, NODE name); //增加一个邻近节点

NEIGHBOR CopyNeibors(NEIGHBOR adjacents); //复制子节点集

NEIGHBOR ExpandNodes(NODE node, int zero); //扩展节点集

PATH AddNodeToPath(NODE name, PATH path); //在路径中加一个节点形成新的路径

PATH CopyPath(PATH path); //复制一条路径

PATHSET CopyPaths(PATHSET paths); //复制路径集合

void RevPath(PATH path); //路径倒序

void ShowPath(PATH path); //输出路径

PATHSET AddPathToPaths(PATH path, PATHSET paths);//把一条路径加入路经集合

PATH ClearPath(PATH path); //回收路径

PATHSET ClearPaths(PATHSET paths); //回收路径集合

PSTACK PushAPath(PSTACK stack, PATH path); //一条路径进栈

PATHSET PushPaths(PSTACK stack, PATHSET paths);//所有路径进栈

PSTACK PopNode(PSTACK stack, NODE name, PATH* path);
//出栈获取节点和路径

PSTACK ClearPstack(PSTACK stack); //回收栈

STATUS SearchPath(NODE start, NODE end, PATH* path, int zero);
//路径搜索

/回路/
STATUS IsInPath(NODE name, PATH path); //判断节点是否在路径中

NEIGHBOR DeleteNodeInPath(NEIGHBOR adjacents, PATH path);
//从节点集合中删除其在路径中的节点

PATHSET PathSetByNodes(NEIGHBOR adjacents, PATH path, PATHSET paths);
//将每个节点加入路径,以便形成路径集合(删除构成回路节点)

/图操作/

/*
int Equal(NODE n1, NODE n2, int* fun())
{
return (int)fun(n1, n2); //相等为0 不等为1
}

void Set(NODE n1, NODE n2, void* fun())
{
fun(n1, n2); //将n2值赋给n1
}
*/
STATUS equal(NODE node1, NODE node2) //比较两个九宫格是否相等
{
int i, j;
STATUS flag = TRUE; //九宫格相等
for ( i = 0; i < MAXSIZE; i++)
{
for ( j = 0; j < MAXSIZE; j++)
{
if (node1[i][j] != node2[i][j]) //其中有一个元素不相等
{
flag = FLASE;
break;
}

	}
	if (!flag)								//九宫格不相等
	{
		break;
	}
}
return flag;

}

void setvalue(NODE node1, NODE node2) //将九宫格复制
{
int i, j;
for ( i = 0; i < MAXSIZE; i++)
{
for ( j = 0; j < MAXSIZE; j++)
{
node1[i][j] = node2[i][j];
}
}
}

void PriNode(NODE node) //打印九宫格
{
int i, j;
for (i = 0; i < MAXSIZE; i++)
{
for (j = 0; j < MAXSIZE; j++)
{
printf("%5d", node[i][j]);
}
puts("");
}
printf("_______________________________\n");
}

STATUS Locate(NODE node, int* row, int* col, int zero)
{ //确定空格位置
int i, j;
STATUS flag = FLASE;
for (i = 0; i < MAXSIZE; i++)
{
for (j = 0; j < MAXSIZE; j++)
{
if (node[i][j] == zero)
{
*row = i;
*col = j;
flag = TRUE;
break;
}
}
if (flag)
{
break;
}
}
return flag;
}

void Exchange(NODE node, int r1, int c1, int r2, int c2)
{ //交换九宫格两个位置
int tp;
tp = node[r1][c1];
node[r1][c1] = node[r2][c2];
node[r2][c2] = tp;
}

NEIGHBOR ExpandNodes(NODE node, int zero)
{
NEIGHBOR adjacents = NULL;
int r, c;
NODE tp;
if (!Locate(node, &r, &c, zero))
{
return adjacents;
}
if (r0 && c0)
{
setvalue(tp, node); //对九宫格赋值
Exchange(tp, r, c, r + 1, c); //交换位置
adjacents = AddNeibor(adjacents, tp); //收集新的节点

	setvalue(tp, node);
	Exchange(tp, r, c, r, c + 1);
	adjacents = AddNeibor(adjacents, tp);
}

else if (r==0 && c==1)
{
	setvalue(tp, node);
	Exchange(tp, r, c, r, c - 1);
	adjacents = AddNeibor(adjacents, tp);

	setvalue(tp, node);
	Exchange(tp, r, c, r, c + 1);
	adjacents = AddNeibor(adjacents, tp);

	setvalue(tp, node);
	Exchange(tp, r, c, r + 1, c);
	adjacents = AddNeibor(adjacents, tp);
}

else if (r==0 && c==2)
{
	setvalue(tp, node);
	Exchange(tp, r, c, r, c - 1);
	adjacents = AddNeibor(adjacents, tp);

	setvalue(tp, node);
	Exchange(tp, r, c, r + 1, c);
	adjacents = AddNeibor(adjacents, tp);
}

else if (r==1 && c==0)
{
	setvalue(tp, node);
	Exchange(tp, r, c, r - 1, c);
	adjacents = AddNeibor(adjacents, tp);

	setvalue(tp, node);
	Exchange(tp, r, c, r + 1, c);
	adjacents = AddNeibor(adjacents, tp);

	setvalue(tp, node);
	Exchange(tp, r, c, r, c + 1);
	adjacents = AddNeibor(adjacents, tp);
}

else if (r==1 && c==1)
{/*
	setvalue(tp, node);
	Exchange(tp, r, c, r + 1, c);
	adjacents = AddNeibor(adjacents, tp);

	setvalue(tp, node);
	Exchange(tp, r, c, r - 1, c);
	adjacents = AddNeibor(adjacents, tp);

	setvalue(tp, node);
	Exchange(tp, r, c, r, c + 1);
	adjacents = AddNeibor(adjacents, tp);

	setvalue(tp, node);
	Exchange(tp, r, c, r, c - 1);
	adjacents = AddNeibor(adjacents, tp);
	 */
	setvalue(tp, node);
	Exchange(tp, r, c, r - 1, c);
	adjacents = AddNeibor(adjacents, tp);

	setvalue(tp, node);
	Exchange(tp, r, c, r + 1, c);
	adjacents = AddNeibor(adjacents, tp);

	setvalue(tp, node);
	Exchange(tp, r, c, r, c - 1);
	adjacents = AddNeibor(adjacents, tp);

	setvalue(tp, node);
	Exchange(tp, r, c, r, c + 1);
	adjacents = AddNeibor(adjacents, tp);
	
}

else if (r==1 && c==2)
{
	setvalue(tp, node);
	Exchange(tp, r, c, r - 1, c);
	adjacents = AddNeibor(adjacents, tp);
	

	setvalue(tp, node);
	Exchange(tp, r, c, r + 1, c);
	adjacents = AddNeibor(adjacents, tp);

	setvalue(tp, node);
	Exchange(tp, r, c, r, c - 1);
	adjacents = AddNeibor(adjacents, tp);
}

else if (r==2 && c==0)
{
	

	setvalue(tp, node);
	Exchange(tp, r, c, r - 1, c);
	adjacents = AddNeibor(adjacents, tp);
	setvalue(tp, node);
	Exchange(tp, r, c, r, c + 1);
	adjacents = AddNeibor(adjacents, tp);
}

else if (r==2 && c==1)
{
	setvalue(tp, node);
	Exchange(tp, r, c, r - 1, c);
	adjacents = AddNeibor(adjacents, tp);

	setvalue(tp, node);
	Exchange(tp, r, c, r, c - 1);
	adjacents = AddNeibor(adjacents, tp);

	setvalue(tp, node);
	Exchange(tp, r, c, r, c + 1);
	adjacents = AddNeibor(adjacents, tp);
}

else if (r==2 && c==2)
{
	setvalue(tp, node);
	Exchange(tp, r, c, r - 1, c);
	adjacents = AddNeibor(adjacents, tp);

	setvalue(tp, node);
	Exchange(tp, r, c, r, c - 1);
	adjacents = AddNeibor(adjacents, tp);
}

return adjacents;

}

long LengthOfPath(PATH path) //统计路径长度
{
PATH p = path;

long count = 0;
while (p)
{
	count++;
	p = p->next;
}

return count;

}

NEIGHBOR AddNeibor(NEIGHBOR nb, NODE name)
{
NEIGHBOR b, pb; //临时兄弟节点变量
b = (NEIGHBOR)malloc(sizeof(struct NEIGHBORNODE));

setvalue(b->name, name);
b->next = NULL;
if (nb == NULL)								//nb为空,b为大兄弟
{
	nb = b;
}
else										//nb不为空找到最后一个兄弟
{
	pb = nb;
	while (pb->next)
	{
		pb = pb->next;
	}
	pb->next = b;
}

return nb;

}

NEIGHBOR ClearNeibors(NEIGHBOR nb)
{
NEIGHBOR b = nb; //临时兄弟
while (nb)
{
b = nb;
nb = nb->next;
free(b);
}
return nb;
}

/路径操作/

PATH AddNodeToPath(NODE name, PATH path)
{
PATH p;
p = (PATH)malloc(sizeof(struct NEIGHBORNODE));
//Set(p->name, name, SetValue);
setvalue(p->name, name);

if (path == NULL)							//路径为空,p为第一个节点
{
	p->next = NULL;
}
else
{
	p->next = path;							//倒序插入
}
path = p;
return path;

}

NEIGHBOR CopyNeibors(NEIGHBOR adjacents)
{
NEIGHBOR pnode, rear, head;
head = NULL; //开始无子节点
while (adjacents)
{
//复制节点
pnode = (NEIGHBOR)malloc(sizeof(struct NEIGHBORNODE));
//Set(pnode->name, children->name, SetValue);
setvalue(pnode->name, adjacents->name);
pnode->next = NULL;

	if (head == NULL)								//第一个节点
	{
		head = pnode;
	}
	else									//与rear = pnode关联,建立链接
	{
		rear->next = pnode;
	}
	rear = pnode;							//rear始终为最后一个节点
	adjacents = adjacents->next;				//开始下一个节点
}
return head;

}

PATH CopyPath(PATH path)
{
PATH tp;
tp = (PATH)CopyNeibors((NEIGHBOR)path); //复用复制兄弟节点;
return tp;
}

PATHSET CopyPaths(PATHSET paths)
{
PATHSET pnode, rear = NULL, head = NULL;
while (paths)
{
pnode = (PATHSET)malloc(sizeof(struct PATHS));
pnode->path = CopyPath(paths->path);
pnode->next = NULL;

	if (head == NULL)						//第一条路径
	{
		head = pnode;
	}
	else									//与rear=pnode关联
	{
		rear->next = pnode;					//尾插法
	}
	rear = pnode;
	paths = paths->next;					//下一条路径
}

return head;

}

void RevPath(PATH path)
{
int count = 0, i;
NODE* nodes;
PATH p = path;

while (p)									//统计路径节点个数
{
	p = p->next;
	count++;
}
nodes = (NODE*)malloc(count * sizeof(NODE));//开辟节点数组
for (i = 0, p = path; p; p = p->next, i++)	//读出来
{
	//Set(names[i], p->name, SetValue);
	setvalue(nodes[i], p->name);
}
for (i = count - 1, p = path; p; p = p->next, i--)
{											//存进去
	//Set(p->name, names[i], SetValue);
	setvalue(p->name, nodes[i]);
}

free(nodes);

}

void PriPath(PATH path)
{
PATH p = path;

if (p == NULL)
{
	printf("为空!");
}
else
{
	while (p)
	{
		PriNode(p->name);
		p = p->next;
	}
}

}

PATHSET AddPathToPaths(PATH path, PATHSET paths)
{
PATH ppath;
PATHSET ps = NULL, p;
if (path == NULL)
{
return paths;
}
ppath = CopyPath(path); //复制路径
ps = (PATHSET)malloc(sizeof(struct PATHS));
ps->path = ppath;
ps->next = NULL;

if (paths == NULL)							//路径集合为空
{
	paths = ps;
}
else										//老套路了
{
	p = paths;
	while (p->next)
	{
		p = p->next;
	}
	p->next = ps;
}

return paths;

}

PATHSET PathSetByNodes(NEIGHBOR adjacents, PATH path, PATHSET paths)
{
PATH tp; //临时节点
adjacents = DeleteNodeInPath(adjacents, path);//删除构成回路节点
while (adjacents) //节点不为空
{
tp = CopyPath(path); //复制路径
tp = AddNodeToPath(adjacents->name, tp);//节点入路径

	paths = AddPathToPaths(tp, paths);		//路径入路径集合
	adjacents = adjacents->next;			//下一个节点
}

return paths;

}

PATH ClearPath(PATH path)
{
path = (PATH)ClearNeibors((NEIGHBOR)path); //复用清理兄弟
return path;
}

PATHSET ClearPaths(PATHSET paths)
{
PATHSET ps = paths;
while (paths)
{
ps = paths;
ClearPath(ps->path);
paths = paths->next;
free(ps);
}

return paths;

}

PSTACK PushAPath(PSTACK stack, PATH path)
{
PATH tp;
PSTACK st;
tp = CopyPath(path); //复制路径
st = (PATHSET)malloc(sizeof(struct PATHS));
st->path = tp;
if (stack == NULL) //以下老套路了
{
st->next = NULL;
}
else
{
st->next = stack;
}
stack = st;
return stack;
}

PATHSET PushPaths(PSTACK stack, PATHSET paths)
{
PATHSET p, head;
head = CopyPaths(paths);
p = head;
if § //将新的路径集加到stack前面,两者链接
{
while (p->next)
{
p = p->next;
}
p->next = stack;
stack = head;
}

return stack;

}

PSTACK PopNode(PSTACK stack, NODE node, PATH* path)
{
PSTACK p = stack;
PATH tp;
if §
{
tp = p->path;
//Set(name, tp->name, SetValue);
setvalue(node, tp->name); //获取名称
*path = CopyPath(tp); //获取路径,已经改变了
stack = p->next;
free§;
}
return stack;
}

PSTACK ClearPstack(PSTACK stack)
{
stack = ClearPaths((PATHSET)stack); //复用清除路径集合
return stack;
}

STATUS IsInPath(NODE node, PATH path)
{
PATH p = path;
STATUS flag = FLASE;

while (p)
{
	if (equal(node, p->name) == 1)
	{
		//Equal(name, p->name, EqualFun)
		flag = TRUE;
		break;
	}
	else
	{
		p = p->next;
	}
}
return flag;

}

NEIGHBOR DeleteNodeInPath(NEIGHBOR adjacents, PATH path)
{
NEIGHBOR n1 = adjacents, n2;
STATUS flag = FLASE;
while (n1) //节点集合每个节点
{
flag = IsInPath(n1->name, path); //节点是否在路径中
if (flag) //节点在路径中
{
if (n1 == adjacents) //n1在在节点集合的第一个
{
adjacents = n1->next; //下一个节点
free(n1); //删除当前节点
n1 = adjacents; //其他节点
}
else //n1不在节点集合第一个
{
n2->next = n1->next; //删除链表节点操作
free(n1);
n1 = n2->next;
}
}
else //节点不在路径中
{
n2 = n1; //下一个节点
n1 = n1->next;
}
}

return adjacents;

}

STATUS SearchPath(NODE start, NODE end, PATH* path, int zero)
{
NODE node; //各种变量的建立
NEIGHBOR adjacents;
PSTACK stack = NULL;
STATUS flag = FLASE;
PATH tp = NULL;
PATHSET paths = NULL;

tp = AddNodeToPath(start, tp);
stack = PushAPath(stack, tp); 
while (stack)
{
	tp = ClearPath(tp);
	stack = PopNode(stack, node, &tp);
	if (equal(end, node) == 1)
	{//Equal(target, name, EqualFun);
		flag = TRUE;
		*path = CopyPath(tp);				//获取路径,方便打印
		break;
	}
	adjacents = ExpandNodes(node,zero);
	paths = PathSetByNodes(adjacents, tp, paths);

	stack = PushPaths(stack, paths);
	paths = ClearPaths(paths);
}

ClearPstack(stack);
return flag;

}

int main()
{
PSTACK stack = NULL;
PATH path = NULL;
STATUS flag;
NODE start =
{
{1, 2, 3},
{8, 4, 0},
{7, 6, 5}
};
NODE end =
{
{1, 2, 3},
{8, 0, 4},
{7, 6, 5}
};
printf(“何以为根:\n”);
PriNode(start);
printf(“何以为结:\n”);
PriNode(end);

flag = SearchPath(start, end, &path, ZERO);

printf("PATH:\n");
RevPath(path);
PriPath(path);

if (flag)
{
	printf("\n路径长度: %ld, %d:成功找到", LengthOfPath(path), flag);
}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值