博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva 101 The Blocks Problem
阅读量:6303 次
发布时间:2019-06-22

本文共 5583 字,大约阅读时间需要 18 分钟。

    1. 1.     move a onto b
      在將a搬到b上之前,先將ab上的積木放回原來的位置(例如:1就放回1的最開始位罝)
      2. move a over b
      在將a搬到b所在的那堆積木之上之前,先將a上的積木放回原來的位罝(b所在的那堆積木不動)
      3. pile a onto b
      a本身和其上的積木一起放到b上,在搬之前b上方的積木放回原位
      4. pile a over b
      a本身和其上的積木一起搬到到b所在的那堆積木之上

 

//用链表实现,没有任何算法可言,完全就是模拟,感觉用数组来做代码能更短

//由于用链表来做的原因,涉及到指针所以很多细节问题,实际上调试很久,指针的东西太久没写都忘记

//了,以后要适当复习

//时间0.012

 

 

#include 
#include
#include
#define LEN1 sizeof(struct list)#define LEN2 sizeof(struct node)#define MAX 30 //最多有25个积木struct list{ int num; struct list *prior,*next; struct node *head;}*L;struct node{ int num; struct node *next;};int n,a,b,ans[30]; //ans是在输出答案时保存答案的void print_link(){ struct list *p=L; struct node *q; while(p) { printf("%d\n",p->num); q=p->head; while(q) {printf("%3d",q->num); q=q->next;} printf("\n"); p=p->next; }}void create_link(){ struct list *l1,*l2; int i; L=l1=(struct list*)malloc(LEN1); L->prior=L->next=NULL; L->num=0; L->head=(struct node*)malloc(LEN2); L->head->next=NULL; L->head->num=0; for(i=1; i
prior=l1; l1->next=l2; l2->next=NULL; l2->num=i; l1=l2; l2->head=(struct node*)malloc(LEN2); l2->head->next=NULL; l2->head->num=i; }}void move(struct list *s){ struct node *p=s->head; struct list *l; while(p && p->num!=a && p->num!=b) { p=s->head; l=L; while(l->num!=p->num) l=l->next; s->head=p->next; p->next=l->head; l->head=p; p=s->head; }}//在收到一条指令后要先判断这条指令是否合法,非法的指令是指a和b在同一堆积木中void command_1() //move a onto b 在將a搬到b上之前,先將a和b上的積木放回原來的位置(例如:1就放回1的最開始位罝){ struct list *l1=L,*l2; struct node *h1; int count; while(l1) { h1=l1->head; count=0; while(h1) { if(h1->num==a || h1->num==b) count++; h1=h1->next; } if(count==1) { move(l1); /*printf("move is ok ");*/ } else if(count==2) return ; l1=l1->next; }// printf("\nmove is end\n"); l1=L; while(l1) { if((l1->head) && (l1->head->num)==a) break; l1=l1->next; } l2=L; while(l2) { if((l2->head) && (l2->head->num)==b) break; l2=l2->next; } h1=l1->head; l1->head=h1->next; h1->next=l2->head; l2->head=h1;// printf("command_1 is end\n");}void command_2() //move a over b 在將a搬到b所在的那堆積木之上之前,先將a上的積木放回原來的位罝(b所在的那堆積木不動){ struct list *l1=L,*l2; struct node *h1; int flag,count; while(l1) { h1=l1->head; count=flag=0; while(h1) { if(h1->num==a) {flag=1;count++;} if(h1->num==b) count++; h1=h1->next; } if(count==1 && flag) { move(l1); /*printf("move is ok ");*/ break;} else if(count==2) return ; l1=l1->next; }// printf("\nmove is end\n");// l1=L; while(l1->head->num!=a) l1=l1->next; l2=L; while(l2) { flag=0; h1=l2->head; while(h1) {
if(h1->num==b) {flag=1; break;} h1=h1->next;} if(flag) break; l2=l2->next; } h1=l1->head; l1->head=h1->next; h1->next=l2->head; l2->head=h1;// printf("command_2 is end\n");}void command_3() //pile a onto b 將a本身和其上的積木一起放到b上,在搬之前b上方的積木放回原位{ struct list *l1,*l2; struct node *h1,*h2; int flag,count; l1=L; while(l1) { h1=l1->head; count=flag=0; while(h1) { if(h1->num==b) {flag=1;count++;} if(h1->num==a) count++; h1=h1->next; } if(count==1 && flag) { move(l1); /*printf("move is ok ");*/ break;} else if(count==2) return ; l1=l1->next; }// printf("\nmove is over\n");// l1=L; while(l1->head->num!=a) l1=l1->next; l2=L; while(l2) { flag=0; h1=l2->head; while(h1) { if(h1->num==a) {flag=1; break;} h1=h1->next; } if(flag) break; l2=l2->next; } h2=h1->next; h1->next=l1->head; l1->head=l2->head; l2->head=h2;// printf("command_3 is end\n");}void command_4() //pile a over b 將a本身和其上的積木一起搬到到b所在的那堆積木之上{ struct list *l1,*l2; struct node *h1,*h2,*temp1,*temp2; int flag; l1=L; while(l1) { flag=0; h1=l1->head; while(h1) {
if(h1->num==a) {flag=1; break;} h1=h1->next;} if(flag) break; l1=l1->next; } l2=L; while(l2) { flag=0; h2=l2->head; while(h2) {
if(h2->num==b) {flag=1; break;} h2=h2->next;} if(flag) break; l2=l2->next; } if(l1==l2) return ; temp1=h1->next; h1->next=l2->head; l2->head=l1->head; l1->head=temp1;// printf("command_4 is end\n");}void print_answer(){ struct list *p=L; struct node *q; int i; while(p) { printf("%d:",p->num); q=p->head; i=-1; while(q) { ans[++i]=q->num; q=q->next; } while(i>=0) printf(" %d",ans[i--]); printf("\n"); p=p->next; }}int main(){ int i; char s1[20],s2[20]; scanf("%d",&n); create_link(); //print_link(); while(1) { scanf("%s",s1); if(!strcmp(s1,"quit")) break; scanf("%d%s%d",&a,s2,&b); //printf("%s %d %s %d\n",s1,a,s2,b); if(a==b) continue; if ( !strcmp(s1,"move") && !strcmp(s2,"onto") ) { /*printf("command_1\n");*/command_1(); } else if( !strcmp(s1,"move") && !strcmp(s2,"over") ) { /*printf("command_2\n");*/command_2(); } else if( !strcmp(s1,"pile") && !strcmp(s2,"onto") ) { /*printf("command_3\n");*/command_3(); } else if( !strcmp(s1,"pile") && !strcmp(s2,"over") ) { /*printf("command_4\n");*/command_4(); }// print_answer(); } print_answer(); return 0;}

 

 

 

转载地址:http://eayxa.baihongyu.com/

你可能感兴趣的文章
Android中的组件安全漏洞介绍和检测
查看>>
web之三建立https
查看>>
10个让人眼花缭乱的 HTML5 和 JavaScript 效果
查看>>
用C语言操作Sqlite数据库
查看>>
mac电脑的idea环境显示行号的方式
查看>>
Coding and Paper Letter(十五)
查看>>
java加密解密_____MD5加密(用户名映射(用户名和密码)串)唯一性
查看>>
java实现简单的LL1语法分析器
查看>>
mysql 自定义排序函数field()
查看>>
CentOS6 X64中VSFtp配置中的一个问题
查看>>
我的友情链接
查看>>
yum 报错Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
查看>>
华为S5700交换机常用配置命令-----不全
查看>>
Django提供静态文件服务
查看>>
MVC页面跳转
查看>>
接口框架服务RAP搭建
查看>>
iOS开发之核心动画(Core Animation)
查看>>
GNS3中PIX的激活使用
查看>>
安装配置LAMP
查看>>
排序算法大集锦_交换类——冒泡排序
查看>>