数据结构python版课程设计_数据结构课程设计

本文介绍了两部分数据结构课程设计的内容:一是使用单向循环链表解决报数问题,通过模拟游戏过程确定最后胜出者;二是迷宫问题的求解,利用栈实现非递归方法找出走出迷宫的路径。文章提供了详细的代码实现,包括报数问题的C++代码和迷宫问题的C++代码,以及迷宫求解的算法流程和存储结构。
摘要由CSDN通过智能技术生成

数据结构课程设计

首先恭喜你已经通过明亮的眼睛找到了这篇博客的密码,这篇文章是给那些“忙于学习”的同学写的。所以,废话不多说,直接上代码。

一、报数问题

1·问题描述

有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向。

游戏开始,从1号小朋友开始顺时针报数,接下来每个小朋友的报数是上一个小朋友报的数加1。若一个小朋友报的数为k的倍数或其末位数(即数的个位)为k,则该小朋友被淘汰出局,不再参加以后的报数。当游戏中只剩下一个小朋友时,该小朋友获胜。

例如,当n=5, k=2时:

1号小朋友报数1;

2号小朋友报数2淘汰;

3号小朋友报数3;

4号小朋友报数4淘汰;

5号小朋友报数5;

1号小朋友报数6淘汰;

3号小朋友报数7;

5号小朋友报数8淘汰;

3号小朋友获胜。

给定n和k,请问最后获胜的小朋友编号为多少?

输入格式

输入一行,包括两个整数n和k,意义如题目所述。

输出格式

输出一行,包含一个整数,表示获胜的小朋友编号。

样例输入

5 2

样例输出

3

样例输入

7 3

样例输出

4

数据规模和约定

对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 9。

要求:利用单向循环链表存储结构模拟此过程。

2·代码部分

#include

using namespace std;

#include

//这题是模拟过程可抽象为在每个时间片状态模拟。

//像是动画制作,每一帧代表一片时间,每一帧的图案对应状态,帧与帧的转换等价于状态改变

typedef struct person{

int index;//个人属性:序号+存活状态

struct person *next;

}Person;

typedef Person* Ptr;//方便同时定义多个结构体指针

Ptr create_single_circle_list(int n)//创建单向循环链表,构造初始状态及个体间的关系

{

//Person* head;Person* pre;Person* last;

//结构体指针必须分开定义,或者把Person* 定义成Ptr

Ptr head,pre,last;//头、后继、前驱指针

head =(Ptr)malloc(sizeof(Person));

head->index=1;

pre=head;

for(int i=1;i

{

Person* last=(Ptr)malloc(sizeof(Person));

last->index=i+1;

pre->next=last;

pre=last;

}

pre->next=head;

return head;

}

Ptr play(Ptr head,int n,int k)//报数过程模拟

{

Ptr pre,last;

int count=1;//模拟报号数字

pre=head;

while(n>1)//全局属性:n为目前还存活的人数

{

//index既代表每个人固定的序号,

//也代表着当前个人存活状态:正数=>存活; -1=>死亡

//只有活着的人可以报数,所以只对存活者操作

if(pre->index!=-1)

{

//若当前存活者报的数为k的倍数或个位数为k,

//当前状态变为死亡

//当前存活人数减一

//计算或是模拟过程无非是状态的转变,此题的结果判断依赖于当前存活人数,

//分解为个人存活、全局存活人数两个状态

if(count%k==0||count%10==k)

{

pre->index=-1;

n--;

}

count++;//只要当前状态为存活,就必须报数

}

pre=pre->next;//无论当前存活状态如何都必须模拟报数人的移动

}

return head;

}

void output(Ptr head,int n)//输出获胜编号

{

Ptr pre=head;

while(n>1)

{

if(pre->index!=-1)

{

cout<index;

break;

}

else pre=pre->next;

}

}

int main()

{

int n,k;

cin>>n>>k;

Ptr head=create_single_circle_list(n);

head=play(head,n,k);

output(head,n);

return 0;

}

二、迷宫问题求解

1·问题描述

任务:

​可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;

要求:

在上交资料中请写明:存储结构、基本算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;

2·代码部分

#include

using namespace std;

#define MAXSIZE 1000

typedef int Status;

typedef struct

{

int x;

int y;

} Postype;

typedef struct

{

int ord; //通道块路径上的序号

Postype seat; //通道快在迷宫中的坐标位置

int dir; //从此通道快走向下一个通道快的方向

} SElemType; //栈的元素类型

typedef struct

{

//SElemType data[MAXSIZE];

SElemType *top;

SElemType *base;

} Stack; //栈的结构类型

typedef struct

{

char arr[MAXSIZE][MAXSIZE];

} MAZETYPE; //迷宫结构体

MAZETYPE maze;

//创建一个迷宫图

void InitMaze(int m, int n)

{

printf("请开始您的私人地图\n");

for (int i = 1; i <= m; i++)

{

for (int j = 1; j <= n; j++)

{

cin >> maze.arr[i][j];

}

}

printf("你建立的迷宫为(最外圈为墙)...\n");

for (int i = 0; i <= m + 1; i++) //加一圈围墙

{

maze.arr[i][0] = '1';

maze.arr[i][n + 1] = '1';

}

for (int j = 0; j <= n + 1; j++)

{

maze.arr[0][j] = '1';

maze.arr[m + 1][j] = '1';

}

for (int i = 0; i <= m + 1; i++) //输出迷宫

{

for (int j = 0; j <= n; j++)

{

printf("%c ", maze.arr[i][j]);

}

printf("%c", maze.arr[i][n + 1]);

printf("\n");

}

}

//创建一个栈初始化

Status initStack(Stack &s)

{

s.base = (SElemType *)malloc(MAXSIZE * sizeof(SElemType));

if (!s.base)

return 0;

s.top = s.base;

return 1;

}

//入栈

void Push(Stack &s, SElemType e)

{

*s.top++ = e;

}

//出栈

void Pop(Stack &s, SElemType &e)

{

e = *--s.top;

}

//判栈空

Status StackEmpty(Stack &s)

{

if (s.top == s.base)

return 1;

else

return 0;

}

//可通过

Status Pass(Postype curpos)

{

if (maze.arr[curpos.x][curpos.y] == '0')

return 1;

else

return 0;

}

//留下通过的足迹

void Foot(Postype curpos)

{

maze.arr[curpos.x][curpos.y] = '*';

}

//标记不可通的位置

void MarkPrint(Postype curpos)

{

maze.arr[curpos.x][curpos.y] = '!';

}

//判断是否已经到达了出口

Status StructCmp(Postype a, Postype b)

{

if (a.x == b.x && a.y == b.y)

return 1;

else

return 0;

}

//寻找下一个位置

Postype NextPos(Postype CurPos, int Dir)

{

Postype ReturnPos;

switch (Dir)

{

case 1: //探索右

ReturnPos.x = CurPos.x;

ReturnPos.y = CurPos.y + 1;

break;

case 2: //下

ReturnPos.x = CurPos.x + 1;

ReturnPos.y = CurPos.y;

break;

case 3: //左

ReturnPos.x = CurPos.x;

ReturnPos.y = CurPos.y - 1;

break;

case 4: //上

ReturnPos.x = CurPos.x - 1;

ReturnPos.y = CurPos.y;

break;

default:

break;

}

return ReturnPos;

}

//进行路径的查找

Status MazePath(Postype start, Postype end1, Stack &s1)

{

/*

如果迷宫maze中存在从入口start到出口end的通道,

则求得一条存放在栈中(从栈底到栈顶),并返回1,否则返回0。

*/

SElemType e;

Postype curpos = start;

int curstep = 1;

do

{

if (Pass(curpos))

{

Foot(curpos); //留下足迹

e = {curstep, curpos, 1}; //将序列号,可通点的坐标和存入

Push(s1, e); //将其存入战中

if (StructCmp(curpos, end1))

{

maze.arr[end1.x][end1.y] = '@';

return 1;

} //若找到出口则输出

curpos = NextPos(curpos, 1); //查找下一个位置

curstep++;

}

else

{

if (!StackEmpty(s1))

{

SElemType e;

Pop(s1, e);

curstep--;

while (e.dir == 4 && !StackEmpty(s1))

{

MarkPrint(e.seat);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值