codeforces Restore Cube(暴力枚舉)

來源:互聯網
上載者:User

標籤:style   blog   color   io   os   for   資料   div   sp   

 1 /* 2     題意:給出立方體的每個頂點的座標(是由源座標三個數某幾個數被交換之後得到的!),  3     問是否可以還原出一個立方體的座標,注意這一句話: 4     The numbers in the i-th output line must be a permutation of the numbers in i-th input line! 5      6     思路: 7           我們只要對輸入的每一行資料進行枚舉每一個排列, 然後檢查時候能構成立方體就好了!  8           檢查立方體:找到最小的邊長的長度 l, 統計邊長為l, sqrt(2)*l, sqrt(3)*l的邊長 9           條數,如果恰好分別為12, 12, 4那麼就是立方體了... 10 */11 #include<iostream>12 #include<cstdio>13 #include<cstring>14 #include<algorithm>15 16 using namespace std;17 18 typedef long long LL;19 20 LL num[8][3], d[70];21 22 LL dis(int i, int j){23     return  (num[i][0]-num[j][0])*(num[i][0]-num[j][0]) +24             (num[i][1]-num[j][1])*(num[i][1]-num[j][1]) + 25             (num[i][2]-num[j][2])*(num[i][2]-num[j][2]);26 }27 28 29 void out(){30     for(int i=0; i<8; ++i){31         printf("%lld", num[i][0]);32          for(int j=1; j<3; ++j)33              printf(" %lld", num[i][j]);34          printf("\n");35     }36 }37 38 int vis[8][8]; 39 40 bool check(){41     int cnt=0;42     int cnt1=0, cnt2=0, cnt3=0;43     LL L=(1LL)<<60;44     memset(vis, 0, sizeof(vis));45     for(int i=0; i<8; ++i)46         for(int j=0; j<8; ++j)47              if(i!=j && !vis[i][j] && !vis[j][i]){48                  d[cnt++]=dis(i, j);49                  vis[i][j]=vis[j][i]=1;50                  if(L>d[cnt-1])51                     L=d[cnt-1];52             }53     if(L==0) return false;54     for(int i=0; i<cnt; ++i)55         if(d[i] == L) cnt1++;56         else if(d[i] == 2*L) cnt2++;57         else if(d[i] == 3*L) cnt3++;58     if(cnt1==12 && cnt2==12 && cnt3==4) return true;59     return false; 60 }61 62 bool dfs(int cur){63     if(cur>=8) return false;64     sort(num[cur], num[cur]+3);//排序 65     do{66         if(check()){67             printf("YES\n");68             out();69             return true;70         }71         if(dfs(cur+1)) return true;//得到當前的全排列之後,繼續向下尋找 72     }while(next_permutation(num[cur], num[cur]+3));//枚舉這一個行的每一個全排列 73     return false;74 }75 76 int main(){77     for(int i=0; i<8; ++i)78         for(int j=0; j<3; ++j)79             scanf("%lld", &num[i][j]);80     if(!dfs(0))81        printf("NO\n");82     return 0;83 }

 

codeforces Restore Cube(暴力枚舉)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.