免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 9722 | 回复: 48
打印 上一主题 下一主题

下面这个C代码怎样 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-26 23:14 |只看该作者 |倒序浏览
本帖最后由 蚊见蚊爱 于 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. }

复制代码

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2011-04-27 09:18 |只看该作者
不知道15数码是什么。

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

论坛徽章:
0
3 [报告]
发表于 2011-04-27 09:35 |只看该作者
如果不是特殊情况,一个函数120多行,有点太长了。。。。

论坛徽章:
1
技术图书徽章
日期:2013-09-09 13:47:26
4 [报告]
发表于 2011-04-27 09:36 |只看该作者
  1. register int j,k,s,t,l,d,p,q,del,piece,moves;
复制代码
11个寄存器变量?寄存器一共有几个?

论坛徽章:
0
5 [报告]
发表于 2011-04-27 10:01 |只看该作者
没注释没子函数 一律无视

论坛徽章:
2
天蝎座
日期:2014-03-28 10:18:052015年亚洲杯之乌兹别克斯坦
日期:2015-02-10 11:32:25
6 [报告]
发表于 2011-04-27 10:14 |只看该作者
只有一个函数,而且还有这么多全局变量

论坛徽章:
0
7 [报告]
发表于 2011-04-27 17:02 |只看该作者
一不小心
居然看到了 goto trymove;
其余的看法同3,5,6楼

论坛徽章:
0
8 [报告]
发表于 2011-04-27 17:08 |只看该作者
空格都没有,main前没int,也缺return。
就算有注释也看得晕。

论坛徽章:
0
9 [报告]
发表于 2011-04-27 17:12 |只看该作者
不爽

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
10 [报告]
发表于 2011-04-27 19:34 |只看该作者
不咋地,估计是学生,搞什么ACM的,在YY中
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP