穷举法迷宫求解简单实现,主要是锻炼队列及链表的使用,直接上代码:
//
// main.c
// migong
//
// Created by mac on 12-8-13.
// Copyright 2012年 __MyCompanyName__. All rights reserved.
//
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
int x;
int y;
}DATA;
typedef struct node
{
DATA data;
struct node *next;
}ListNode;
typedef struct
{
int x;
int y;
int pre;
}TP;
TP qu[100];//队列
int f,r;
//迷宫数组,外面一圈1主要用于防止越界用
int a[6][7]={
{1,1,1,1,1,1,1},
{1,0,1,1,1,0,1},
{1,1,0,1,0,1,1},
{1,0,1,0,0,1,1},
{1,0,1,1,1,0,1},
{1,1,1,1,1,1,1}
};
//八个方向,上下左右,左上左下,右上右下
int mg[8][2]={
{1,1},
{1,0},
{1,-1},
{0,-1},
{-1,-1},
{-1,0},
{-1,1},
{0,1}
};
//路径打印函数
void print(int f,int m2,int n2)
{
ListNode *h,*q,*p;
int s,pr;
s=f;
h=(ListNode *)malloc(sizeof(ListNode));//链表头
h->next=NULL;
q=(ListNode *)malloc(sizeof(ListNode));
q->data.x=m2;
q->data.y=n2;
q->next=h->next;
h->next=q;
q=(ListNode *)malloc(sizeof(ListNode));
q->data.x=qu[s].x;
q->data.y=qu[s].y;
q->next=h->next;
h->next=q;
pr=qu[s].pre;
while(pr!=0)
{
q=(ListNode *)malloc(sizeof(ListNode));
q->data.x=qu[pr].x;
q->data.y=qu[pr].y;
q->next=h->next;
h->next=q;
pr=qu[pr].pre;
}
p=h->next;
printf("(%d,%d)",p->data.x,p->data.y);
p=p->next;
while(p!=NULL)
{
printf("--(%d,%d)",p->data.x,p->data.y);//打印链表
p=p->next;
}
}
//迷宫求解
void MazePath(int m1,int n1,int m2,int n2)
{
TP k;
int p,q,v;
f=r=0;
k.x=m1;
k.y=n1;
k.pre=0;
r++;
qu[r]=k;
a[m1][n2]=2;
while(f<r)//队列不为空
{
f++;
k=qu[f];
for(v=0;v<8;v++)//八个方向穷举
{
p=k.x+mg[v][0];
q=k.y+mg[v][1];
if(a[p][q]==0)
{
if(p==m2&&q==n2)
{
print(f,m2,n2);
return ;
}
r++;
qu[r].x=p;
qu[r].y=q;
qu[r].pre=f;
a[p][q]=2;
}
}
}
}
int main (int argc, const char * argv[])
{
int i,j;
printf("迷宫图:\n");
puts("---------------------");
for(i=0;i<6;i++)
{
for(j=0;j<7;j++)
printf(" %d ",a[i][j]);
printf("\n");
}
puts("---------------------");
printf("行走路径如下:\n");
MazePath(1,1,4,5);
printf("\n");
return 0;
}
最后上个图:
版权声明:本文为wangqiuyun原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。