程式設計之美上24點遊戲的實現
阿新 • • 發佈:2019-01-22
#include<set> #include<stdio.h> using namespace std; set<int> f(int i); void game24(int Array[]); bool Check(set<int> s); bool print(set<int> s) { set<int>::iterator it=s.begin(); while(it!=s.end()){ //while(it++!=s.end())少用。 //一般都需要在迴圈體中訪問變數自增之前的值 printf("%d|",*it); it++; } printf("\n"); } set<int> S[16]; int n=4; int main() { int temp,i=0; printf("input the numbers:\n"); int Array[4]; for(int i=0;i<4;i++) scanf("%d",&Array[i]); game24(Array); /*for(int i=0;i<16;i++){ print(S[i]); }*/ return 0; } void Fork(set<int> A,set<int> B,set<int>& result) { set<int>::iterator iter1=A.begin(),iter2=B.begin(); while(iter1!=A.end()) { while(iter2!=B.end()) { result.insert((*iter1)+(*iter2)); result.insert((*iter1)-(*iter2)); result.insert((*iter1)*(*iter2)); result.insert((*iter2)-(*iter1)); if((*iter1)!=0) if((*iter2)%(*iter1)==0) result.insert((*iter2)/(*iter1)); if((*iter2)!=0) if((*iter1)%(*iter2)==0) result.insert((*iter1)/(*iter2)); iter2++; } iter1++; } } void game24(int Array[]) { for(int i=0;i<n;i++) S[1<<i].insert(Array[i]); //pow(2,n)等價於1<<n,而不是2<<n for(int i=1;i<1<<n;i++){ S[i]=f(i); } if(Check(S[(1<<n)-1])==true) //左移的優先順序低於算術運算,需要加括號 printf("yes\n"); else printf("no\n"); } bool Check(set<int> s) { set<int>::iterator iter=s.begin(); while(iter!=s.end()){ if(*iter==24) return true; iter++; } return false; } set<int> f(int i) { set<int> tempSet; if(S[i].empty()==false) return S[i]; for(int x=1;x<i;x++) { if((x&i)==x) //&優先順序低於關係運算符號 { Fork(f(x),f(i-x),tempSet); S[i].insert(tempSet.begin(),tempSet.end()); } } return S[i]; }