枚舉:基於逐個嘗試答案的一種問題求解策略ios
形如a^3= b^3 + c^3 + d^3的等式被稱爲完美立方等式。例如 12^3= 6^3 + 8^3 + 10^3 。編寫一個程序,對任給的正整數N (N≤100),尋找全部的四元組(a, b, c, d),使得a^3 = b^3 + c^3 + d^3,其中a,b,c,d 大於1 , 小於等於N,且b<=c<=d。 輸入 一個正整數N (N≤100)。 輸出 每行輸出一個完美立方。輸出格式爲: Cube = a, Triple = (b,c,d) 其中a,b,c,d所在位置分別用實際求出四元組值代入。 要求a從小到大輸出。
四重循環枚舉a,b,c,d a在最外層,d在最裏層,每一層都是從小到大枚舉, a 範圍 [2, N] b 範圍 [2, a-1] c 範圍 [b, a-1] d 範圍 [c, a-1]
// 完美立方 # include <stdio.h> int main(void) { int a,b,c,d; int N; scanf("%d",&N); for (a=2; a<=N; a++) for (b=2; b<=a-1; b++) for (c=b; c<=a-1; c++) for (d=c; d<=a-1; d++) if (a*a*a == b*b*b + c*c*c + d*d*d) printf("Cube = %d, Triple = (%d,%d,%d)\n",a,b,c,d); return 0; }
人生來就有三個生理週期,分別爲體力、感情和智力週期, 它們的週期長度爲23天、28天和33天。每個週期中有一天 是高峯。在高峯這天,人會在相應的方面表現出色。 例如,智力週期的高峯,人會思惟敏捷,精力容易高度集中。 由於三個週期的周長不一樣,因此一般三個週期的高峯不會落在 同一天。對於每一個人,咱們想知道什麼時候三個高峯落在同一天。 對於每一個週期,咱們會給出從當前年份的第一天開始, 到出現高峯的天數(不必定是第一次高峯出現的時間)。 你的任務是給定一個從當年第一天開始數的天數, 輸出從給定時間開始(不包括給定時間)下一次三個高峯 落在同一天的時間(距給定時間的天數)。 例如:給定時間爲10,下次出現三個高峯同天的時間是12, 則輸出2(注意這裏不是3)。輸入有多組數據,以一行-1結束。
從第d+1天開始, 一直試到第21252天,對其中每一天看是否知足 當前日期與 p e i差值分別能被 23 28 33 同時整除
// 生理週期 # include <iostream> using namespace std; int main(void) { int p,e,i,d,j, num=0; // 不必所有枚舉 while (cin>>p>>e>>i>>d && p!=-1) { ++num; for (j=d+1; (j-p)%23; j++); // 先找到第一個是23倍數的日期 for ( ; (j-e)%28; j+=23); // 再按照23的增量查看是不是28的倍數 for ( ; (j-i)%33; j+=23*28); // 最後再以23*28的增量肯定是不是33 的倍數 cout<<"Case"<<num<<": the next triple peak occours in"; cout<<j-d<<"days"<<endl; // 最後輸出 j d 之間的間隔 } return 0; }
有12枚硬幣,其中有11枚真幣和1枚假幣。 假幣和真幣重量不一樣,但不知道假幣比真幣輕仍是重。 如今,用一架天平稱了這些幣三次,告訴你稱的結果, 請你找出假幣而且肯定假幣是輕仍是重。 輸入樣例: 1 ABCD EFGH even //天平左邊是ABCD四枚,右邊是EFGH,平衡。 ABCI EFJK up //右邊翹起來 ABIJ EFGH even //相同 //表示的都是右邊重量
對於每一枚硬幣先假設它是輕的,看是否符合稱量結果。 若是符合,則問題解決。不然,假設他是重的,看是否 符合稱量結果。把全部硬幣都試一遍,必定能找到特殊硬幣。
// 稱硬幣 # include <iostream> # include <cstring> using namespace std; char Left[3][7]; // 天平左邊硬幣 char Right[3][7]; // 天平右邊硬幣 char result[3][7]; // 結果 bool IsFake(char c, bool light); int main(void) { int t; cin>>t; while(t--) { for (int i = 0; i<3; i++) cin>>Left[i]>>Right[i]>>result[i]; for (char c='A'; c<='L'; c++) { if (IsFake(c, true)) { cout<<c<<" is the counterfeit coin and it is light.\n"; break; } else if(IsFake(c, false)) { cout<<c<<" is the counterfeit coin and it is heavy.\n"; break; } } } return 0; } bool IsFake(char c, bool light) // light 爲真表示假設假幣爲輕,不然假幣爲重 { for (int i=0; i<3; i++) { char * pLeft,*pRight; // 指向天平兩邊的字符串 if (light) { pLeft = Left[i]; pRight = Right[i]; } else // 若是假設是重的,則把天平結果左右對換 { pLeft = Right[i]; pRight = Left[i]; } switch(result[i][0]) // 天平右邊的狀況 { case 'u': if(strchr(pRight,c) == NULL) return false; break; case 'e': if(strchr(pLeft,c) || strchr(pRight,c)) return false; break; case 'd': if(strchr(pLeft,c) == NULL) return false; break; } } return true; }
部份內容轉自 https://blog.csdn.net/NNNNNNNNNNNNY/article/details/51584247 c++
// 熄燈問題_02_plus #include <stdio.h> int puzzle[6][8], press[6][8]; /* 推測驗證過程: 根據第一行猜想 */ bool guess() { int c, r; //根據press第1行和puzzle數組,計算press其餘行的值 for(r=1; r<5; r++) { for(c=1; c<7; c++) { press[r+1][c]=(puzzle[r][c]+press[r][c]+press[r-1][c]+press[r][c-1]+press[r][c+1])%2; } } //判斷所計算的press數組可否熄滅第5行的全部燈 for(c=1; c<7; c++) { if ((press[5][c-1]+press[5][c]+press[5][c+1]+press[4][c])%2 != puzzle[5][c]) { return false; } } return true; } /* 枚舉過程: 對press第1行的元素press[1][1]~press[1][6]的各類取值進行枚舉 */ void enumerate() { int c; bool success; //這個變量時當時定義了沒排上用場吧,NodYoung注 for(c=1; c<7; c++) { press[1][c]=0; } while(guess()==false) { press[1][1]++; c=1; while(press[1][c]>1) { //累加進位 press[1][c]=0; c++; press[1][c]++; } } return ; } int main() { int cases, i, r, c; scanf("%d", &cases); for(r=0; r<6; r++) { press[r][0]=press[r][7]=0; } for(c=0; c<7; c++) { press[0][c]=0; } for(i=0; i<cases; i++) { for(r=1; r<6; r++) { for(c=1; c<7; c++) { scanf("%d", &puzzle[r][c]); //讀入輸入數據 } } enumerate(); printf("PUZZLE#%d\n", i+1); for (r=1; r<6; r++) { for (c=1; c<7; c++) { printf("%d ", press[r][c]); } printf("\n"); } } return 0; }
// 熄燈問題_03_plus #include <memory> #include <string> #include <cstring> #include <iostream> using namespace std; int GetBit(char c,int i) { //取c的第i位 return ( c >> i ) & 1; } void SetBit(char & c,int i, int v) { //設置c的第i位爲v if( v ) c |= ( 1 << i); else c &= ~( 1 << i); } void Flip(char & c, int i) { //將c的第i位爲取反 c ^= ( 1 << i); } void OutputResult(int t,char result[]) //輸出結果 { cout << "PUZZLE #" << t << endl; for( int i = 0;i < 5; ++i ) { for( int j = 0; j < 6; ++j ) { cout << GetBit(result[i],j); if( j < 5 ) cout << " "; } cout << endl; } } int main() { char oriLights[5]; //最初燈矩陣,一個比特表示一盞燈 char lights[5]; //不停變化的燈矩陣 char result[5]; //結果開關矩陣 char switchs; //某一行的開關狀態 int T; cin >> T; for( int t = 1; t <= T; ++ t) { memset(oriLights,0,sizeof(oriLights)); for( int i = 0;i < 5; i ++ ) { //讀入最初燈狀態 for( int j = 0; j < 6; j ++ ) { int s; cin >> s; SetBit(oriLights[i],j,s); } } for( int n = 0; n < 64; ++n ) { //遍歷首行開關的64種狀態 memcpy(lights,oriLights,sizeof(oriLights)); switchs = n; //第i行的開關狀態 for( int i = 0;i < 5; ++i ) { result[i] = switchs; //第i行的開關方案 for( int j = 0; j < 6; ++j ) { if( GetBit(switchs,j)) { if( j > 0) Flip(lights[i],j-1);//改左燈 Flip(lights[i],j);//改開關位置的燈 if( j < 5 ) Flip(lights[i],j+1);//改右燈 } } if( i < 4 ) lights[i+1] ^= switchs;//改下一行的燈 switchs = lights[i]; //第i+1行開關方案和第i行燈狀況同 } if( lights[4] == 0 ) { OutputResult(t,result); break; } } // for( int n = 0; n < 64; n ++ ) } return 0; }
RRR數組