LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: lordbyorn

求能计算所有方阵的程序

[复制链接]
 楼主| 发表于 2003-7-12 04:20:37 | 显示全部楼层
C++果然有好处。
设计和修改时简单多了。
以后还是多用C++,这样可以更加专注于算法的设计。

要程序运行得快,算法最重要,而不是语言。
 楼主| 发表于 2003-7-12 14:09:27 | 显示全部楼层
上面的有点小错。

  1. #include<time.h>
  2. #include<stdio.h>

  3. #define Max 20
  4. #define MAX(x,y) (x)>(y)?(x) : (y)

  5. int count=0;
  6. int END;
  7. int M,MM;
  8. int sum;
  9. int maxnum,minnum;
  10. int data[Max*Max];
  11. int flags[Max*Max];

  12. FILE *outfile;
  13. time_t start,end;
  14. int min_not_used[Max+1]={0};
  15. int max_not_used[Max+1]={0};

  16. class STACKDATA{
  17. private:
  18.         int buff[Max+1];
  19.         int cursor;
  20. public:
  21.         STACKDATA(){
  22.                 cursor=-1;
  23.                 sum=0;
  24.         }
  25.         ~STACKDATA(){
  26.         }
  27.         int push(int newdata){
  28.                 buff[++cursor]=newdata;
  29.                 sum+=newdata;
  30.                 return 1;
  31.         }
  32.         int pop(){
  33.                 if(cursor<0)return -1;
  34.                 sum-=buff[cursor];
  35.                 return buff[cursor--];
  36.         }
  37.         int sum;
  38. };

  39. void init();
  40. void bye();
  41. void range(int,int,int,int,int);
  42. void magic(int);
  43. void output(void);


  44. STACKDATA rowbuff[Max+1];
  45. STACKDATA colbuff[Max+1];
  46. STACKDATA  ldbuff[Max+1];
  47. STACKDATA  rdbuff[Max+1];

  48. /***********  bigin main   *************/

  49. int main(int argc,char *argv[]) {
  50. if(argc!=2){
  51.          fprintf(stderr,"usage: %s num\n",argv[0]);
  52.          return 1;
  53. }
  54. sscanf(argv[1],"%d",&M);
  55. init();
  56. magic(0);
  57. bye();
  58. return 0;
  59. }

  60. /******    end of main  *****************/

  61. void init()
  62. {

  63. int i;
  64. outfile=fopen("result.txt","w");
  65. for(i=0;i<Max*Max;i++)flags[i]=0;
  66. if(M>Max){puts("Max M exceed!!\n");}
  67. MM=M*M;
  68. sum=(MM+1)*M/2;
  69. END=MM-1;
  70. start=time(&start);
  71. fprintf(outfile,"start at %s\n//////////////////////////////////\n",ctime(&start));

  72. }

  73. /************************************************/
  74. void bye()
  75. {
  76. end=time(&end);
  77. fprintf(outfile,"\n//////////////////////////////////\nend at %s\n",ctime(&end));
  78. fprintf(outfile,"%d matchs found!",count);
  79. fclose(outfile);
  80. }
  81. /***************************************************/
  82. void magic(int n)
  83. {
  84. int i,ii;
  85. int max;
  86. int col,row,rdiag,ldiag;

  87. row=n/M;
  88. col=n%M;
  89. ldiag=(col-row+M)%M;
  90. rdiag=(col+row+M)%M;
  91. range(n,row,col,ldiag,rdiag);

  92.         for(i=minnum,max=maxnum;i<=max;i++) {
  93.                 if(flags[i]==0) {
  94.                         ii=i+1;
  95.                         flags[i]=1;
  96.                         data[n]=ii;
  97.                         rowbuff[row].push(ii);
  98.                         colbuff[col].push(ii);
  99.                         ldbuff[ldiag].push(ii);
  100.                         rdbuff[rdiag].push(ii);
  101.                         if(n==(END)){
  102.                                 output();
  103.                         }
  104.                         else magic(n+1);
  105.                         flags[i]=0;
  106.                         rowbuff[row].pop();
  107.                         colbuff[col].pop();
  108.                         ldbuff[ldiag].pop();
  109.                         rdbuff[rdiag].pop();
  110.                 }
  111.         }
  112.         return;
  113. }

  114. /**********************************************************/
  115. void output()
  116. {
  117.         int i,j;

  118.         count++;
  119.         fprintf(outfile,"%d:\n",count);
  120.         for(i=0;i<M;i++){
  121.                 for(j=0;j<M;j++){
  122.                         fprintf(outfile,"%5d",data[i*M+j]);
  123.                 }
  124.                 fputc('\n',outfile);
  125.         }
  126.         fflush(outfile);
  127. }



  128. /*******************  This function to large!!!        ************/
  129. void range(int n,int row,int col,int ldiag,int rdiag) {
  130. static int used;
  131. static int bottom,top,left;
  132. static int c;
  133. static int tmp;
  134. static int i,j,k;

  135. k=MAX(M-col,M-row);

  136. if(k>M)k=M;
  137. for(i=0,c=1,tmp=0;c<=k;i++){
  138.          if(flags[i]==0){
  139.                 tmp+=i+1;
  140.                 c++;
  141.                 min_not_used[c]=tmp;
  142.          }
  143. }
  144. for(i=END,c=1,tmp=0;c<=k;i--){
  145.          if(flags[i]==0){
  146.                 tmp+=i+1;
  147.                 c++;
  148.                 max_not_used[c]=tmp;
  149.          }
  150. }

  151. used=rowbuff[row].sum;
  152. left=sum-used-1;
  153. bottom=max_not_used[M-col];
  154. top   =min_not_used[M-col];
  155.         minnum=left-bottom;
  156.         maxnum=left-top;
  157.          
  158. used=colbuff[col].sum;
  159. left=sum-used-1;
  160. bottom=max_not_used[M-row];
  161. top   =min_not_used[M-row];
  162. minnum=minnum<left-bottom?left-bottom:minnum;
  163. maxnum=maxnum>left-top?left-top:maxnum;

  164. used=ldbuff[ldiag].sum;
  165. left=sum-used-1;
  166. bottom=max_not_used[M-row];
  167. top   =min_not_used[M-row];
  168. minnum=minnum<left-bottom?left-bottom:minnum;
  169. maxnum=maxnum>left-top?left-top:maxnum;

  170. used=rdbuff[rdiag].sum;
  171. left=sum-used-1;
  172. bottom=max_not_used[M-row];
  173. top   =min_not_used[M-row];
  174. minnum=minnum<left-bottom?left-bottom:minnum;
  175. maxnum=maxnum>left-top?left-top:maxnum;

  176. if(minnum<0)minnum=0;
  177. if(maxnum>=MM)maxnum=MM-1;
  178. }

  179. /*****************  end of program   ***********************/
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表