蚂蚁问题的编程解决
2018-06-17 21:16:26来源:未知 阅读 ()
有一根27厘米的细木杆,在杆上某些位置上各有一只蚂蚁。木杆很细,不能同时通过一只以上蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,输出各时刻杆上蚂蚁的位置和方向,每个时刻离杆的蚂蚁的编号,所有蚂蚁的离杆时间。最后输出各蚂蚁离杆时间。
代码如下(C语言):
1 #include <stdio.h> 2 #include <malloc.h> 3 #include <stdlib.h> 4 5 void main() 6 { 7 int t, i, flag; 8 short *p1; 9 int *p2; 10 struct ant //保存蚂蚁信息的结构体类型 11 { 12 struct ant *next; 13 struct ant *before; 14 short direction; //蚂蚁位置 15 int position; //蚂蚁方向 16 int sign; //蚂蚁编号 17 }; 18 struct ant *psnew, *q, *head, *front, *after; 19 20 typedef struct ant node; 21 22 struct ant2 23 { 24 int time; 25 int sign; 26 struct ant2 *next; 27 }; 28 struct ant2 *t2, *q2, *head2, *psnew2; 29 30 typedef struct ant2 node2; 31 32 struct ant3 33 { 34 int sign; 35 struct ant3 *next; 36 }; 37 struct ant3 *head3, *psnew3, *q3; 38 39 typedef struct ant3 node3; 40 41 printf ("please input the number of ants in stick\n"); /*输入位于杆上的蚂蚁个数,不能为0,数量不超过27*/ 42 scanf ("%d", &t); 43 44 p1=(short *)malloc (t*sizeof(short)); 45 p2=(int *)malloc (t*sizeof(int)); 46 47 for (i=0; i<t; i++) 48 { 49 printf ("please input the direction of %dnd ant\n", i+1); /*输入第i+1个蚂蚁的初始方向,1表示向右,0表示向左*/ 50 scanf ("%d", p1+i); 51 52 printf ("pleaase input the position of %dnd ant\n", i+1); /*输入第i+1个蚂蚁的初始位置,杆长27cm,位置为蚂蚁所在处距杆左端的长度,只能为正整数,即位置只能为1cm,2cm,3cm---,26cm,27cm,位置需按照蚂蚁编号从小到大输入*/ 53 scanf ("%d", p2+i); 54 } 55 56 head=(node *)malloc (sizeof(node)); 57 q=head; 58 head->next=NULL; 59 head->before=NULL; 60 61 for (i=0; i<t; i++) 62 { 63 psnew=(node *)malloc (sizeof(node)); 64 psnew->next=NULL; 65 66 psnew->direction=p1[i]; //初始化蚂蚁队列和各蚂蚁刚开始的位置方向 67 psnew->position=p2[i]; 68 psnew->sign=i+1; 69 70 q->next=psnew; 71 psnew->before=q; 72 q=psnew; 73 } 74 75 head3=(node3 *)malloc (sizeof(node3)); 76 head3->next=NULL; 77 q3=head3; 78 79 head2=(node2 *)malloc (sizeof(node2)); 80 head2->next=NULL; 81 q2=head2; 82 83 t=0; 84 while (head->next!=NULL) /*判断线性链表是否为空链表,从而判断是否全部的蚂蚁都爬下了杆子,若是退出循环输出t,否则继续循环*/ 85 { 86 t++; /*时间进一过度到下一个时间点*/ 87 q=head->next; 88 89 while (q!=NULL) /*检测当前节点对应的蚂蚁的方向,根据方向调整蚂蚁的位置*/ 90 { 91 if (q->direction) 92 q->position=q->position+1; /*这种位置调整方式存在漏洞.若某时刻前一蚂蚁与后一蚂蚁位置相隔1,前一蚂蚁向右运动,后一蚂蚁向左运动,则按这种方式时间进一后前一蚂蚁将爬到后一蚂蚁前面一格,换言之两只蚂蚁位置交换了*/ 93 else /*换言之两只蚂蚁互相穿过了对方,这是不可能的,实际上时间进一后两只蚂蚁仍在原来的位置,两只蚂蚁在他们原来两个位置的中点相碰又回到了原来的位置,并且此时他们的方向应该和原来方向相反*/ 94 q->position=q->position-1; /*因此需要对两只蚂蚁的位置方向进行修正,此外若时间进一所有蚂蚁按照各自的方向移动一格后,两只蚂蚁位置相同,即他们相对碰撞,则碰撞后蚂蚁运动方向和原来相反,因此也需要修正方向.*/ 95 96 q=q->next; 97 } 98 99 psnew=head->next; /*psnew指向第一个节点*/ 100 if (psnew->next!=NULL) /*判断第一个节点是否为尾节点,若不是说明有两只以上蚂蚁,则进行碰撞检测,修正蚂蚁运动方向,以及对发生相互穿越错误的一对蚂蚁的位置方向进行修正*/ 101 { 102 q=psnew; 103 psnew=head; 104 flag=1; 105 106 do 107 { 108 psnew=psnew->next; 109 q=q->next; 110 111 if ((psnew->position)>(q->position)) /*检测发生相互穿越错误的一对蚂蚁并对其位置和方向进行修正*/ 112 { 113 i=psnew->direction; 114 psnew->direction=q->direction; 115 q->direction=i; 116 117 i=psnew->position; 118 psnew->position=q->position; 119 q->position=i; 120 121 front=psnew->before; 122 if (front->before!=NULL) 123 { 124 if(front->position==psnew->position) /*进行碰撞检测,对碰撞后蚂蚁的方向进行修正*/ 125 { 126 i=front->direction; 127 front->direction=psnew->direction; 128 psnew->direction=i; 129 130 if (q->next!=NULL) 131 { 132 after=q->next; 133 if(after->position==q->position) 134 { 135 i=after->direction; 136 after->direction=q->direction; 137 q->direction=i; 138 flag=0; 139 } 140 } 141 } 142 } 143 } 144 else 145 { 146 if (((psnew->position)==(q->position))&&flag) 147 { 148 i=psnew->direction; 149 psnew->direction=q->direction; 150 q->direction=i; 151 } 152 else 153 flag=1; 154 } 155 } 156 while (q->next!=NULL); 157 } 158 159 psnew=head; 160 q=psnew->next; 161 while (q!=NULL) 162 { 163 if ((q->position<1) || (q->position>=27)) /*蚂蚁的方向位置都修正完毕后对当前节点对应的蚂蚁的位置进行检测,判断蚂蚁是否爬下杆子*/ 164 { 165 psnew3=(node3 *)malloc (sizeof(node3)); 166 psnew3->sign=q->sign; //保存越界的蚂蚁节点 167 psnew3->next=NULL; 168 169 q3->next=psnew3; 170 q3=psnew3; 171 172 psnew2=(node2 *)malloc (sizeof(node2)); 173 psnew2->sign=q->sign; //建立另一个越界的蚂蚁节点,保存该蚂蚁离杆的时间 174 psnew2->time=t; 175 176 if (head2->next==NULL) 177 { 178 psnew2->next=NULL; 179 q2->next=psnew2; 180 } 181 else 182 { 183 t2=head2; 184 q2=q2->next; 185 while (1) 186 { 187 if ((psnew2->sign)<(q2->sign)) //对越界的蚂蚁节点执行插入排序 188 { 189 psnew2->next=q2; 190 t2->next=psnew2; 191 q2=head2; 192 break; 193 } 194 else 195 { 196 if (q2->next==NULL) 197 { 198 q2->next=psnew2; 199 psnew2->next=NULL; 200 q2=head2; 201 break; 202 } 203 else 204 { 205 t2=t2->next; 206 q2=q2->next; 207 } 208 } 209 } 210 } 211 212 if (q->next!=NULL) /*蚂蚁爬下杆子故需对节点进行删除,先判断删除的节点是否为尾节点,若不是尾节点,按照非尾节点释放该节点,释放后被释放节点的指针指向被释放节点后一节点*/ 213 { 214 psnew->next=q->next; 215 after=q->next; 216 after->before=q->before; 217 free (q); 218 q=psnew->next; 219 } 220 else 221 { 222 free (q); /*若释放的节点是尾节点,直接删除尾节点,尾节点前一节点指针域置空指针,被释放节点的指针置空指针*/ 223 psnew->next=NULL; 224 q=psnew->next; 225 } 226 } 227 else 228 { 229 psnew=q; /*检测到当前节点对应的蚂蚁没有爬下杆子,故前驱节点的指针指向当前节点,当前节点的指针指向下一节点,为下一蚂蚁爬下杆子的判断与处理做准备*/ 230 q=q->next; 231 } 232 } 233 234 q=head; 235 while(q->next!=NULL) 236 { 237 q=q->next; 238 printf ("at the time%d,the%dnd ant is at the position%d,in the direction%d\n", t, q->sign, q->position, q->direction); /*输出当前时刻杆上所有蚂蚁的编号,位置,方向*/ 239 } 240 241 if (head3->next!=NULL) 242 { 243 q3=head3->next; 244 while (q3!=NULL) 245 { 246 printf ("The %dnd ant is off the stick at time%d\n", q3->sign, t); //输出当前时间t离杆的蚂蚁编号 247 q3=q3->next; 248 } 249 250 q3=head3; 251 while (q3->next!=NULL) 252 { 253 psnew3=q3->next; 254 q3->next=psnew3->next; 255 free (psnew3); 256 } 257 } 258 } 259 printf ("the time of all ants need to be off the stick is %d\n", t); /*输出全部蚂蚁爬下杆子所对应时刻(蚂蚁均位于初始位置时视为t=0时刻),也就是蚂蚁全部爬出杆子所需时间*/ 260 printf ("\n"); 261 262 q2=q2->next; 263 while (q2!=NULL) 264 { 265 printf ("The %dnd ant is off the stick at time%d\n", q2->sign, q2->time); //输出各蚂蚁离杆时间 266 q2=q2->next; 267 } 268 } 269 270 /*用线性链表实现解决蚂蚁问题,若干蚂蚁位于一长杆上,杆长27cm,蚂蚁初始方向可以任意,运动速度1cm/s,蚂蚁从初始位置出发,两蚂蚁若相碰不能穿过对方,只能相碰后各自掉头,求蚂蚁全部爬出杆子所需时间*/
当初始时刻木杆有三只蚂蚁,从左至右数第一只蚂蚁位置方向为3,1,第二只为4,0,第三只为5,0时输出结果如下:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:扩展中国剩余定理详解
下一篇:中国剩余定理详解
- C代做 C++代做 C++编程代做 C++程序代做 2020-04-29
- 第七章 2.泛型编程(模板) 2020-04-04
- linux环境下的时间编程 2020-03-27
- C、C++ 标准输入重定向 & 万能头 - 编程技巧 2020-03-20
- C++ 常用编程--Swap函数有几种写法? 2020-02-26
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash