vijos P1134 算24點 題解

2021-07-09 17:30:19 字數 1564 閱讀 4681

#include #include #include #include #include using namespace std;

bool used[5];

int a[5];

bool mem[1000];

double qiku[120][1001];

int ans;

void work(double now,int k)

int tot=0;

if(k==3)

//printf("%d ",tot);

int s=++qiku[tot][0];

qiku[tot][s]=now;

// printf("%.1f|%d|%d ",qiku[tot][s],tot,s);

// if (s%6==0)

// printf("\n");

} if(ans==1)return;

for(int i=1;i<=4;i++)

}int main()

if(s[0]=='a') a[i]=1;

if(s[0]<'a') a[i]=s[0]-'0';

if(s[0]=='j') a[i]=11;

if(s[0]=='q') a[i]=12;

if(s[0]=='k') a[i]=13;

}ans=0;

memset(used,0,sizeof(used));

memset(qiku,0,sizeof(0));

for(int i=1;i<=4;i++)

if(!ans)

//for(int i=1;i<=1;i+=2)

for(int i=1,j=2;j<=4;j++)}}

if(ans)

printf("1\n");

else printf("0\n");

}

首先我相信函式work裡面的遞迴大家都能理解 就是列舉各種可能 也就是說就是乙個簡單的dfs

主要是說後面的迴圈和qiku這個函式的作用

首先我們來看這道題 這題讓我們找出四個數能否組成24 我們現在想一下 四個數用加減乘除如何能組成二十四

是不是說只用兩種情況 乙個是對乙個數一步一步的與其他三個數進行加減乘除運算 得到24 簡單的說 比如 1 2 3 4   就是用1*2=2 然後在用2*3=6 6*4=24 得出的 就是說這種是乙個數 一步一步的運算 我們用dfs就可以簡單的實現

還有一種情況 就是說 兩兩進行乘除運算 然後將得到的值進行加減運算 比如 5 5 -5 -5 就是5*5--5/-5=24 而我們的dfs無法做到讓他們兩兩乘除運算後再做加減運算 這就是上面程式後面的迴圈的意義,也就是qiku這個陣列的作用 

qiku這個陣列就是用來儲存每兩個數之間運算時得到的值 他用1 2 4 8 標記了 a b c d 四個初始的書 這樣 qiku[1+2] 就表示取ab兩個數之間的運算 qiku[1+4]表示取ac qiku[1+8]表示取ad qiku[2+4]表示取bc qiku[2+8]表示取bd qiku[4+8]表示取cd 

然後在外面的迴圈裡進行兩兩操作(即再進行加減乘除運算) 就能得到答案

算24點程式

基本原理是窮舉4個整數所有可能的表示式,然後對表示式求值。表示式的定義 expression expression number operator expression number 因為能使用的4種運算子 都是2元運算子,所以本文中只考慮2元運算子。2元運算子接收兩個引數,輸出計算結果,輸出的結果...

遞迴之算24

給出4個小於10的正整數,你可以使用加減乘除以及括號把這四個數字連線起來得到乙個表示式,現在的問題是,是否存在一種方式使得到的結果剛好為24,這裡加減乘除以及括號的運算結果以及優先順序和我們平時的定義一樣,除法是實數除法 例 5 5 5 1 5 5 1 5 24 1 1 4 2 無法得到24 inc...

高階24 算菜價

24 算菜價 問題描述 媽媽每天都要出去買菜,但是回來後,兜裡的錢也懶得數一數,到底花了多少錢真是一筆糊塗帳。現在好了,作為好兒子 女兒 的你可以給她用程式算一下了,呵呵。輸入說明 輸入含有一些資料組,第一行第乙個數是測試組數,第二行第乙個資料是菜種數,每組資料報括菜種 字串 數量 計量單位不論,一...