mazeltov

展開圖.c

Mar 25th, 2017
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.74 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define POINT 6
  4. #define SET_M 3
  5. #define WIH 8
  6. #define MAX 25
  7.  
  8. /*
  9. imatrix,free_imatrix   是抄數值分析課本的函式
  10. 主要是讓2D array 比較好傳到別的函式中
  11. pruf_adjm  請參考 https://en.wikipedia.org/wiki/Pr%C3%BCfer_sequence
  12.  
  13. issave 是出問題的函式  他很髒請小心 ^_^
  14.  
  15. dfs 是把 adjm轉成印出來的答案 很多參數......
  16. */
  17. int **imatrix(nrl,nrh,ncl,nch)
  18. int nrl,nrh,ncl,nch;
  19. {
  20.     int i,**m;
  21.     m=(int **)malloc((unsigned) (nrh-nrl+1)*sizeof(int*));
  22.     if (!m) printf("allocation failure 1 in imatrix()");
  23.     m -= nrl;
  24.     for(i=nrl; i<=nrh; i++)
  25.     {
  26.         m[i]=(int *)malloc((unsigned) (nch-ncl+1)*sizeof(int));
  27.         if (!m[i]) printf("allocation failure 2 in imatrix()");
  28.         m[i] -= ncl;
  29.     }
  30.     return m;
  31. }
  32. void free_imatrix(m,nrl,nrh,ncl,nch)
  33. int **m;
  34. int nrl,nrh,ncl,nch;
  35. {
  36.     int i;
  37.     for(i=nrh; i>=nrl; i--) free((char*) (m[i]+ncl));
  38.     free((char*) (m+nrl));
  39. }
  40. //end matrix
  41.  
  42.  
  43. void pruf_adjm(int *,int **);   //translate
  44. int pfpp(int *);                //pf[]++
  45. int isame(int **,int **,int *);
  46. int issave(int ***s,int **tp,int flg);
  47. void save(int **s,int **tp)
  48. {
  49.     int i,j;
  50.     for(i=0; i<POINT; i++)
  51.         for(j=0; j<POINT; j++)
  52.             s[i][j]=tp[i][j];
  53. }
  54.  
  55. //void setarray(int *);
  56. void setmtx(int **,int);
  57.  
  58. //masks:
  59. void xrot(int *);
  60. void yrot(int *);
  61. void zrot(int *);
  62. void mirror(int *);
  63. void remask(int *);
  64. //end masks
  65.  
  66. void dfs(int **,int **,int,int,int,int,int,int);
  67. //把關係矩陣轉成可以看到的答案
  68.  
  69. void printans(int **,int);
  70.  
  71. /*******************************************************/
  72.  
  73. int main()
  74. {
  75.     int i,j,k,aflag=0;
  76.     int prufer[POINT-1]= {0};
  77.     int **adjmap;
  78.     adjmap=imatrix(0,POINT-1,0,POINT-1);
  79.  
  80.     int **mp2;           //map2
  81.     mp2=imatrix(0,WIH,0,WIH);
  82.  
  83.     int **ansmaps[MAX];       //array of (int**)
  84.     for(i=0; i<MAX; i++)
  85.         ansmaps[i]=imatrix(0,POINT-1,0,POINT-1);
  86.  
  87.     i=0;
  88.     while(pfpp(prufer))
  89.     {
  90.         setmtx(adjmap,POINT);
  91.         pruf_adjm(prufer,adjmap);
  92.         if(adjmap[0][1]==0||adjmap[0][2]==0)
  93.             continue;
  94.         if(adjmap[0][POINT-1]==1||adjmap[1][POINT-2]==1||adjmap[2][POINT-3]==1)
  95.             continue;
  96.         i++;
  97.         if(issave(ansmaps,adjmap,aflag)) /*!!!!!!!!!!!!!!!*/
  98.         save(ansmaps[aflag++],adjmap);
  99.  
  100.         if(aflag>MAX-1)
  101.         {
  102.             printf("too~many~~anssssss= = ,runs=%d\n\n",i);
  103.             break;
  104.         }
  105.     }
  106.  
  107.     free_imatrix(adjmap,0,POINT-1,0,POINT-1);
  108.  
  109.     for(i=0; i<aflag; i++)
  110.     {
  111.         setmtx(mp2,WIH);
  112.         dfs(ansmaps[i],mp2,0,0,SET_M,SET_M,1,2);
  113.         printans(mp2,WIH);
  114.         printf("%d th map\n",i+1);
  115.     }
  116.  
  117.     printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~\n");
  118.  
  119.     free_imatrix(mp2,0,WIH,0,WIH);
  120.     for(i=0; i<aflag; i++)
  121.         free_imatrix(ansmaps[i],0,POINT-1,0,POINT-1);
  122.  
  123.     return 0;
  124. }
  125.  
  126. /*****************************************************/
  127.  
  128. int pfpp(int *pf)
  129. {
  130.     int i=0;
  131.  
  132.     while(pf[POINT-2]==0)
  133.     {
  134.         if(pf[i]<POINT-1)
  135.         {
  136.             pf[i]++;
  137.             return 1;
  138.         }
  139.         else
  140.             pf[i++]=0;
  141.     }
  142.     return 0;
  143. }
  144. void pruf_adjm(int *prf,int **adj)
  145. {
  146.     int i,j;
  147.     int cnt[POINT]= {0};
  148.  
  149.     for(i=0; i<POINT-2; i++)
  150.         cnt[prf[i]]++;
  151.  
  152.     for(i=0; i<POINT-2; i++)
  153.     {
  154.         for(j=0; j<POINT; j++)
  155.         {
  156.             if(cnt[j]==0)
  157.             {
  158.                 adj[j][prf[i]]=adj[prf[i]][j]=1;
  159.                 cnt[j]--;
  160.                 cnt[prf[i]]--;
  161.                 break;
  162.             }
  163.         }
  164.     }
  165.     for(i=0; i<POINT; i++)
  166.         if (cnt[i]>-1)
  167.             break;
  168.     for(j=POINT-1; j<1; j--)
  169.         if(cnt[j]>-1)
  170.             break;
  171.     adj[i][j]=adj[j][i]=1;
  172. }
  173. int issave(int ***s,int **tp,int flg)
  174. {
  175.     int msk[POINT],i,j;
  176.  
  177.     while(flg)
  178.     {
  179.         flg--;
  180.         remask(msk);
  181.         for(i=0; i<3; i++)
  182.         {
  183.             zrot(msk);
  184.             if(isame(s[flg],tp,msk))
  185.                 return 0;
  186.         }
  187.         zrot(msk);
  188.         xrot(msk);
  189.         if(isame(s[flg],tp,msk))
  190.             return 0;
  191.         for(j=0; j<2; j++)
  192.         {
  193.             for(i=0; i<3; i++)
  194.             {
  195.                 yrot(msk);
  196.                 if(isame(s[flg],tp,msk))
  197.                     return 0;
  198.             }
  199.             yrot(msk);
  200.             zrot(msk);
  201.             if(isame(s[flg],tp,msk))
  202.                 return 0;
  203.             for(i=0; i<3; i++)
  204.             {
  205.                 xrot(msk);
  206.                 if(isame(s[flg],tp,msk))
  207.                     return 0;
  208.             }
  209.             xrot(msk);
  210.             zrot(msk);
  211.             if(isame(s[flg],tp,msk))
  212.                 return 0;
  213.         }
  214.         xrot(msk);
  215.         for(i=0; i<4; i++)
  216.         {
  217.             zrot(msk);
  218.             if(isame(s[flg],tp,msk))
  219.                 return 0;
  220.         }
  221.         mirror(msk);
  222.         if(isame(s[flg],tp,msk))
  223.             return 0;
  224.         for(i=0; i<3; i++)
  225.         {
  226.             zrot(msk);
  227.             if(isame(s[flg],tp,msk))
  228.                 return 0;
  229.         }
  230.         zrot(msk);
  231.         xrot(msk);
  232.         if(isame(s[flg],tp,msk))
  233.             return 0;
  234.         for(j=0; j<2; j++)
  235.         {
  236.             for(i=0; i<3; i++)
  237.             {
  238.                 yrot(msk);
  239.                 if(isame(s[flg],tp,msk))
  240.                     return 0;
  241.             }
  242.             yrot(msk);
  243.             zrot(msk);
  244.             if(isame(s[flg],tp,msk))
  245.                 return 0;
  246.             for(i=0; i<3; i++)
  247.             {
  248.                 xrot(msk);
  249.                 if(isame(s[flg],tp,msk))
  250.                     return 0;
  251.             }
  252.             xrot(msk);
  253.             zrot(msk);
  254.             if(isame(s[flg],tp,msk))
  255.                 return 0;
  256.         }
  257.         xrot(msk);
  258.         for(i=0; i<4; i++)
  259.         {
  260.             zrot(msk);
  261.             if(isame(s[flg],tp,msk))
  262.                 return 0;
  263.         }
  264.     }
  265.  
  266.     return 1;
  267. }
  268. int isame(int **a,int **bb,int *m)
  269. {
  270.     int i,j;
  271.  
  272.     for(i=0; i<POINT-1; i++)
  273.     {
  274.         for(j=i+1; j<POINT; j++)
  275.             if(a[i][j]!=bb[m[i]][m[j]])
  276.                 return 0;
  277.     }
  278.     return 1;
  279. }
  280. void setmtx(int **mtx,int n)
  281. {
  282.     int i,j;
  283.  
  284.     for(i=0; i<n; i++)
  285.         for(j=0; j<n; j++)
  286.             mtx[i][j]=0;
  287. }
  288. void printans(int **ans,int n)
  289. {
  290.     int i,j;
  291.     for(i=0; i<n; i++)
  292.     {
  293.         for(j=0; j<n; j++)
  294.             if(ans[i][j])
  295.                 printf("[%d",ans[i][j]);
  296.             else printf(" .");
  297.         printf("\n");
  298.     }
  299.     printf("----------------------\n");
  300. }
  301. void dfs(int **ans,int **mp2,int chd,int par,int x,int y,int xp,int yp)
  302. {
  303.     int i;
  304.     mp2[x][y]=chd+1;
  305.     for (i=1; i<POINT; i++)
  306.         if (ans[i][chd] && i!= par)
  307.         {
  308.             if(i==xp)
  309.                 dfs(ans,mp2,i,chd,x+1,y,POINT-chd-1,yp);
  310.             if(i==yp)
  311.                 dfs(ans,mp2,i,chd,x,y+1,xp,POINT-chd-1);
  312.             if(i==(POINT-xp-1))
  313.                 dfs(ans,mp2,i,chd,x-1,y,chd,yp);
  314.             if(i==(POINT-yp-1))
  315.                 dfs(ans,mp2,i,chd,x,y-1,xp,chd);
  316.         }
  317.     //printf("leaf:i at %d .x,y=%d,%d\n",i,x,y);
  318. }
  319. //int mask[];
  320. void remask(int *m)
  321. {
  322.     int i;
  323.     for(i=0; i<POINT; i++)
  324.         m[i]=i;
  325. }
  326. void xrot(int *m)
  327. {
  328.     int tmp;
  329.     tmp=m[0];
  330.     m[0]=m[1];
  331.     m[1]=m[POINT-1];
  332.     m[POINT-1]=m[POINT-2];
  333.     m[POINT-2]=tmp;
  334. }
  335. void yrot(int *m)
  336. {
  337.     int tmp;
  338.     tmp=m[POINT-1];
  339.     m[POINT-1]=m[2];
  340.     m[2]=m[0];
  341.     m[0]=m[POINT-3];
  342.     m[POINT-3]=tmp;
  343. }
  344. void zrot(int *m)
  345. {
  346.     int tmp,i;
  347.     tmp=m[1];
  348.     for(i=1; i<POINT-2; i++)
  349.         m[i]=m[i+1];
  350.     m[POINT-2]=tmp;
  351. }
  352. void mirror(int *m)
  353. {
  354.     int tmp;
  355.     tmp=m[0];
  356.     m[0]=m[POINT-1];
  357.     m[POINT-1]=tmp;
  358. }
  359. //mask end
Add Comment
Please, Sign In to add comment