下面这个C代码怎样

发布于 2022-10-15 08:28:48 字数 8593 浏览 27 评论 0

本帖最后由 蚊见蚊爱 于 2011-04-26 23:15 编辑

这个是个15数码的程序,大家评评代码写的如何?

  1. #define row(x) ((x) >>2)
  2. #define col(x) ((x) &0x3)
  3. #include <stdio.h>
  4. #include <time.h>
  5. char board[16];
  6. char start[16];
  7. short tim[100];
  8. char dir[100],pos[100];
  9. int timer;
  10. main(int argc,char*argv[])
  11. {
  12.     register int j,k,s,t,l,d,p,q,del,piece,moves;
  13.     if(argc!=2){
  14.         fprintf(stderr,"Usage: %s startposition\n",argv[0]);
  15.         exit(-1);
  16.     }
  17.     for(j= 0;k= argv[1][j];j++){
  18.         if(k>='0'&&k<='9')k-= '0';
  19.         else if(k>='a'&&k<='f')k-= 'a'-10;
  20.         else{
  21.             fprintf(stderr,
  22.                 "The start position should use only hex digits (0123456789abcdef)!\n");
  23.             exit(-2);
  24.         }
  25.         if(start[k]){
  26.             fprintf(stderr,"Your start position uses %x twice!\n",k);
  27.             exit(-3);
  28.         }
  29.         start[k]= 1;
  30.     }
  31.     for(k= 0;k<16;k++)if(start[k]==0){
  32.         fprintf(stderr,"Your start position doesn't use %x!\n",k);
  33.         exit(-4);
  34.     }
  35.     for(del= j= 0;k= argv[1][j];j++){
  36.         if(k>='0'&&k<='9')k-= '0';else k-= 'a'-10;
  37.         start[j]= k-1;
  38.         for(s= 0;s<j;s++)if(start[s]> start[j])del++;
  39.         if(k==0)t= j;
  40.     }
  41.     if(((row(t)+col(t)+del)&0x1)==0){
  42.         printf("Sorry ... the goal is unreachable from that start position!\n");
  43.         exit(0);
  44.     }
  45.     for(j= moves= 0;j<16;j++)if(start[j]>=0){
  46.         del= row(start[j])-row(j);
  47.         moves+= (del<0?-del:del);
  48.         del= col(start[j])-col(j);
  49.         moves+= (del<0?-del:del);
  50.     }
  51.     if(moves==0)goto win;
  52.     while(1){
  53.         timer= time(0);
  54.         t= moves;
  55.         for(j= 0;j<16;j++){
  56.             board[j]= start[j];
  57.             if(board[j]<0)p= j;
  58.         }
  59.         pos[0]= 16,l= 1;
  60. newlevel:
  61.         d= 0,tim[l]= t,pos[l]= p,q= pos[l-1];
  62. trymove:
  63.         switch(d){
  64.         case 0:
  65.             if(col(p)<=2&&q!=p+1)/*7:*/
  66.             {
  67.                 q= p+1,piece= board[q];
  68.                 del= (col(piece)<col(q)?0x1:0x100);
  69.                 break;
  70.             }
  71.             d++;
  72.         case 1:
  73.             if(row(p)>=1&&q!=p-4)/*8:*/
  74.             {
  75.                 q= p-4,piece= board[q];
  76.                 del= (row(piece)> row(q)?0x1:0x100);
  77.                 break;
  78.             }
  79.             d++;
  80.         case 2:
  81.             if(col(p)>=1&&q!=p-1)/*9:*/
  82.             {
  83.                 q= p-1,piece= board[q];
  84.                 del= (col(piece)> col(q)?0x1:0x100);
  85.                 break;
  86.             }
  87.             d++;
  88.         case 3:
  89.             if(row(p)<=2&&q!=p+4)/*10:*/
  90.             {
  91.                 q= p+4,piece= board[q];
  92.                 del= (row(piece)<row(q)?0x1:0x100);
  93.                 break;
  94.             }
  95.             d++;
  96.         case 4:
  97.             goto backtrack;
  98.         }
  99.         if(t<=del){
  100.             if(t==del)goto win;
  101.             d++;goto trymove;
  102.         }
  103.         dir[l]= d,board[p]= board[q],t-= del,p= q,l++;
  104.         goto newlevel;
  105. backtrack:
  106.         if(l> 1){
  107.             l--;
  108.             q= pos[l],board[p]= board[q],p= q,q= pos[l-1],t= tim[l],d= dir[l]+1;
  109.             goto trymove;
  110.         }
  111.         printf(" ... no solution with %d+%d moves (%d sec)\n",
  112.             moves&0xff,moves>>8,time(0)-timer);
  113.         moves+= 0x101;
  114.     }
  115. win:
  116.     pos[l+1]= q;
  117.     printf("Solution in %d+%d moves: ",moves&0xff,moves>>8);
  118.     if(moves> 0){
  119.         for(j= 0;j<16;j++)board[j]= start[j];
  120.         for(k= 1;k<=l;k++){
  121.             printf("%x",board[pos[k+1]]+1);
  122.             board[pos[k]]= board[pos[k+1]];
  123.         }
  124.         printf(" (%d sec)\n",time(0)-timer);
  125.     }
  126. }

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

情绪失控 2022-10-22 08:28:48

不知道15数码是什么。

那一堆一个字母的变量看着晕,也没有注释,看着像学生写的

眼睛会笑 2022-10-22 08:28:48

如果不是特殊情况,一个函数120多行,有点太长了。。。。

执手闯天涯 2022-10-22 08:28:48
  1. register int j,k,s,t,l,d,p,q,del,piece,moves;

复制代码11个寄存器变量?寄存器一共有几个?

天荒地未老 2022-10-22 08:28:48

没注释没子函数 一律无视

财迷小姐 2022-10-22 08:28:48

只有一个函数,而且还有这么多全局变量

嗫嚅 2022-10-22 08:28:48

一不小心
居然看到了 goto trymove;
其余的看法同3,5,6楼

甜宝宝 2022-10-22 08:28:48

空格都没有,main前没int,也缺return。
就算有注释也看得晕。

尽揽少女心 2022-10-22 08:28:48

不爽

滥情稳全场 2022-10-22 08:28:48

不咋地,估计是学生,搞什么ACM的,在YY中

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文