转跳到内容

随性而为

【会员】中级会员
  • 内容数

    352
  • 加入

  • 最后访问

随性而为 发表的所有内容

  1. 从开池子之前就意识到月卡就剩2天了,但我故意没续,就想看看这次的池子毒不毒,池子一开我就拿着从2月开始攒到现在的合成玉(中间的常规池动都没动)试水,抽的过程中一度怀疑人生,直到最后一个十连才请出了w,差点连月卡都不想氪了,99发2个六星,一个温蒂一个w,真就2%的出货率呗(上次年池也是110抽2个六星,总觉得限定池的出货率比常规池低),我感觉心累,白嫖(小月卡党)想要全六星真的遥遥无期,如果不能全六星,那么月卡对我来说也只是纯粹的浪费钱而已
  2. 怎么说呢,这个DFS虽然可能有点问题(繁琐),但是绝对可以找到最短路径,因为递归的本质就是把所有的可能都走一遍,这其中包括了最短路径,当然我上面的代码可能会输出很多的yes或者no(因为除了最短路径可能会有其他路径),这样的话我们可以声明一个flag=0,把原来输出yes的操作改为通过指针使flag++;当递归结束后判断flag的值,0为no,非0为yes 如果说硬要反复横跳的话,那就把判断的条件改一下呗,就像2楼说得还是比较方便的,判断s-top是否为奇偶。
  3. 感觉就是经典的递归问题…… struct maze { char chara; int visited;//这个就废除了吧 } struct maze[m][n]; (此处略去将maze的每个元素中chara的初始化和visited都为0的操作) int check(int row,int col,struct maze[][],top) { if(row==final_row&&col==final.col) { if(top<=s) printf("yes"); else printf("no");//这里我觉得只要提前到了终点处就算没开也应该要等在那啊,不应该还在失了智的左右横跳等出口啊 } if(row<=m-1&&col<=n-1&&maze[row][col].chara!='#'&&top<=s) { check(row,col+1,maze,top+1); check(row,col-1,maze,top+1); check(row+1,col,maze,top+1); check(row-1,col,maze,top+1); } } int main() { int top=0,start_row(初始化),start_col(初始化); check(start_row,start_col,maze,top); }
  4. 我们都爱懒懒 很磁性的嗓音,温柔而又中气十足,相比之下……我的嗓音太软了
  5. 用二叉树的思路: struct{ int max,min/*代表这一段地址的开始和结束*/,*p/*可以用p=new int[max-min]来存储这一段地址中的数据*/; struct btree *lchild,*rchild,*parent; int base/*判断是否是最底层,每当创造新结点就令该结点的base为1,令其父结点base变0*/ }btree 基本的结构:结点A表示的地址段和其左右结点的地址段的大小关系为 左子树地址段<父节点地址段<右子树地址段 malloc B L:struct *temp1,将B从根节点开始逐层比较,在这个过程中如果出现(结点A.min<B<结点A.max)则表示需要分配的地址重复,函数执行失败,否则,若A.min>B则temp=A.lchild,若A.max<B则temp=A.rchild,直到最底层,同理struct *temp1对B+L也如此操作,若temp==temp1表明他们在同一个未被分配的地址区间,创造一个结点New和已有的树建立联系,,New.min=B,New.max=B+L,同时New.p=new int[New.max-New.min],若temp!=temp1,说明max和min之间夹杂着已被分配的空间,函数执行失败. access p:没什么好说的……,就是逐层判断,看p在那个结点的max和min之间,然后访问那个结点的数组,如果找不到对应的max和min,说明未被分配,函数失败 free p:如果p必须是一开始分配时的基地址时,则逐层和min比较,找到了,则将该结点右子树数据复制给该结点,然后释放该结点的右子树(这样做不会改变基本的结构),如果p没什么严格要求的话,就逐层判断p是否在min,max之间,找到了,则该结点的max=p。如果以上两种情况都i没有找到,则函数执行失败 list :如果是这个结构的话好像就是树的中序遍历?当然要是也要显示free的起始和长度的话可以在btree结构体中加一个变量,但这样对这个变量操作有点烦,不如创一个数组记录每段的min和max,排序一下再遍历输出
  6. 这我倒没想到,既然这样就去下载64位程序啊
  7. 我还是更倾向于用数组的 struct a{ int data; int used; int start } struct a[2^32],一开始a.used都为0,表示未分配 malloc B L时先查找a到a[B+L],如果有一个used为1则不成功,否则a到a[B+L]中used都为1,start都为B,返回B,如果需要记录什么数据就a[B+i]=?; access p就是先看a[p].used,再判断是否读a[p].data; free p就是看a[p].start是否为p,如果是的话就把之后start为p的重置了; list就是int start,count把整个数组遍历一遍综合看a[p].used和a[p].start,每次走完一段就输出start和count,然后刷新这两个变量 (还没学操作系统,基本上就这样?可能有些地方理解错误了,望指出,动脑是不可能动的,这辈子都不可能的)
  8. 所以说我不是修改了那个回复了么……
  9. 浏览了下题目和大佬的初步分析,我感觉没必要用哈希表啊,如果想要o(n^2)的话,可以这样 for(i=0;i<=N;i++) for(j=0;j<=N;j++) if((M-i*A-j*B)%C==0&&(M-i*A-j*B)/C<=N) count ++; 应该是可以跑hard难度的?extreme难度……,你这M怎么记录呢,unsigned long long好像也只能记到2^64-1 (理解错题目的意思了,尴尬) (01规划已经看见大佬提了好多次了,看来是时候取学习一下了) ps:昨天练了一天的车,真jb累,第一次跑还被教练冷嘲热讽的
  10. 问:在双向通道中来回横跳怎么办 然而不管你怎么改,我都不会做
  11. 确实,不过有一说一我第一次听说有学校是这么昵称的
  12. 我们两个……是同一个学校 ps:很佩服那个小姐姐,在椅子上做俯卧撑一个都做不了
  13. 操(指好几种就算很羞耻也要不得不照做的操,以椅子操为代表)
  14. woc,有压轴题内味了,感觉这道题是真的……很少人能当场做出来吧,你们当时学过数据结构么……
  15. #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct tree { int flag; /*1代表目录(文件夹)。2代表文件*/ char name[20]; struct tree *parent; struct tree *child; struct tree *brother; }tree,*list; int checkdir(char dir[]) /*先进行初次判断(绝对路径,相对路径,格式等等,当然还不太完善)*/ { int n=1; if(dir[strlen(dir)-1]=='/'&&strlen(dir)-1!=0)/* '/'能通过而'/new/'不能 */ n=0; if(dir[0]=='/'&&(strstr(dir,"../")!=NULL||strstr(dir,"./")!=NULL))/* 绝对路径下任何地方都不能有'./''../' */ n=0; if(dir[0]!='/'&&((strstr(dir,"../")-dir!=0&&strstr(&dir[3],"../")!=NULL)||(strstr(dir,"./")-dir!=0&&strstr(&dir[2],"./")!=NULL)))/* 相对路径除刚开始不能有'./''../' */ n=0; if(n==0) { printf("error:invalid name,such as '/../new','/new/'"); return 0; } return 1; } /* 下面的exist函数几乎是任何一个操作都要做的,用来看路径中的文件是否存在,如果存在则一步步获取当前文件夹,不存在则看 makeornot,为0时对ls和rm有效 ,提示错误终止命令,为1时代表新建目录,为2时代表新建文件,新建文件(目录)统一用make执行*/ int exist(int makeornot,char dir[],list *now,tree* root) { int i,j=0,a[20],flag=0; tree* cache; tree* temp; if(dir[0]='/')/*绝对路径的情况*/ { cache=root->child; *now=root; for(i=1;dir[i]!='\0';i++) { if(dir[i]!='/') a[j++]=dir[i]; if(dir[i]=='/') { a[j]='\0'; for(;cache;cache=cache->brother) if(strcmp(a,cache->name)==0) { *now=cache; cache=cache->child; flag=1; break; } if(flag==0&&(*now)->flag==2) printf("error:file can't be created");/*判断路径中的每一层,文件是不能存放目录和文件的*/ if(flag==0&&(*now)->flag==1) { if(makeornot==0) { printf("error:not found"); return 0; } else { make(1,dir,now,temp,root,a); cache=NULL; } } flag=0; j=0; } } a[j]='\0'; for(;cache;cache=cache->brother) if(strcmp(a,cache->name)==0) { (*now)=cache; cache=cache->child; //j=0; flag=1; break; } if(flag==0) { if(makeornot==0) { printf("error:not found"); return 0; } else { make(makeornot,dir,now,temp,root,a);/*倒数第一层文论是文件还是目录都可以新建*/ } } return 1; } else/*相对路径的情况*/ { cache=(*now)->child; //*now=(*now); for(i=0;dir[i]!='\0';i++) { if(dir[i]!='/') a[j++]=dir[i]; if(dir[i]=='/') { a[j]='\0'; for(;cache;cache=cache->brother) { if(strcmp(a,"..")==0) { cache=(*now); *now=(*now)->parent; } if(strcmp(a,cache->name)==0) { (*now)=cache; cache=cache->child; flag=1; break; } } if(flag==0&&(*now)->flag==2) printf("error:file can't be created"); if(flag==0&&(*now)->flag==1) { if(makeornot==0) { printf("error:not found"); return 0; } else { make(1,dir,now,temp,root,a); cache=NULL; } } flag=0; j=0; } } a[j]='\0'; for(;cache;cache=cache->brother) if(strcmp(a,cache->name)==0) { (*now)=cache; cache=cache->child; flag=1; break; } if(flag==0) { if(makeornot==0) { printf("error:not found"); return 0; } else { make(makeornot,dir,now,temp,root,a); } } return 1; } } int rmorls(char dir[],tree* now,tree* root,int option)/* 递归操作,option为1时ls,为2时rm */ { if(now==NULL) return; rmorls(dir,now->brother,root,option); rmorls(dir,now->child,root,option); if(option==1) printf("%s/t",now->name); if(option==2) free(now); } int make(int option,char dir[],list *now,tree* temp,tree* root,char a[]) { /*现有文件和已存文件的连接*/ tree *newnode,*p1,*p2; newnode=(tree*)malloc(sizeof(tree)); newnode->brother=NULL; newnode->child=NULL; newnode->parent=(*now); newnode->flag=option; strcpy(newnode->name,a); /*判断新建文件(目录)是否是父目录第一个孩子*/ if((*now)->child==NULL) { (*now)->child=newnode; }else { for(p1=(*now)->child;p1->brother;p1=p1->brother); p1->brother=newnode; } (*now)=temp=newnode; } int cd(char dir[],list *now,tree* root)/*转到路径指定目录,事实上大部分工作被exist函数做了*/ { tree *temp; temp=*now; if(exist(0,dir,now,root)==0) /*如果路径不存在,则当前目录回到没有输入命令前的工作目录*/ *now=temp; /*没有输出*/ } int ls(char dir[],list *now,tree* root)/*因为ls与rm都是对路径递归,只是每次的操作不同,故将其递归部分结合成一个函数lsorrm()*/ { tree *temp; temp=*now; if(exist(0,dir,now,root)==0) { *now=temp; }else { printf("%s:",(*now)->name); rmorls(dir,(*now)->child,root,1); } } int rm(char dir[],list *now,tree* root)/*删除后停留在当前目录*/ { tree *temp,*a,*p1,*p2; temp=*now; if(exist(0,dir,now,root)==0) { *now=temp; }else { rmorls(dir,(*now)->child,root,2); a=(*now)->parent; p1=a->child; if(p1==*now) { p1->parent->child=p1->brother; } else { for(;p2;p2=p1,p1=p1->brother) { if(p2==*now) p1->brother=p2->brother; } } free(*now); *now=a->child; /*因为是删除,连接方式一定会改变,以上步骤就是改变过程*/ } } int main()/*没什么解释的,就是将输入转化为参数,调用对应的函数*/ { tree *root,*now,*temp; root=(tree*)malloc(sizeof(tree)); root->parent=root->child=root->brother=NULL; now=temp=root; int choose; char ope[10]; char dir[100]; while(1) { scanf("%s %s",ope,dir); if(!strcmp(ope,"mkdir")) choose=1; else if(!strcmp(ope,"touch")) choose=2; else if(!strcmp(ope,"cd")) choose=3; else if(!strcmp(ope,"ls")) choose=4; else if(!strcmp(ope,"rm")) choose=5; if(checkdir(dir)==1) { switch(choose) { case 1:exist(1,dir,&now,root);break; case 2:exist(2,dir,&now,root);break; case 3:cd(dir,&now,root);break; case 4:ls(dir,&now,root);break; case 5:rm(dir,&now,root);break; }; } } } 码了一天多终于套完了所有的娃,还没有测试,怕没有达到预期的结果而心跳骤停,再者我软件也缺失debug,要发现问题也是工程量巨大,既然不是正规的,就权当伪代码吧(虽然程序本身并没有语法错误),不过大致框架和思路就是这样,要有一些小问题也不用调整太多,讲真这是我至今为止写过的最长的代码了,也多亏了这道题,我对地址有了更深一步的了解,解决了从上学期以来的一些困惑 ps:这真的是给大一学生做的么,太魔鬼了 修正了些小错误
  16. 我感觉该说的前面两位都说了,我也想不出什么骚话,此贴完结所以为了别让邪神复活应该呼吁全世界砸了计算机 话说楼主召唤阵不顶用啊,通知都没一声
  17. 我还没那么厉害,关于操作系统的api我目前只知道c语言的fopen(),fclose() 我目前只知道c语言,数据结构,html5、c++(现在在学),java(现在在学)
  18. 希望你是开玩笑的……研究生真的辛苦
×
×
  • 新建...

重要消息

为使您更好地使用该站点,请仔细阅读以下内容: 使用条款