hihoCoder搜尋專題1 24點

2021-07-13 10:10:42 字數 1941 閱讀 8980

24點規則,抽取撲克中的四張牌,每張牌使用一次的情況下進行三次加減乘除運算,考慮是否能得到24這個數。

首先是解題思路,在題目裡也有給出,這裡我自己做了歸納;

1.定義運算子 ⊙:

用於表示6種運算,在原本的加、減、乘、除的基礎上加上被減、和被除;

被減的意思是交換兩個數在減和除運算子的前後位置,比如a-b還可以有b-a這種情況。

2.兩種模式:

(((a⊙b)⊙c)⊙d) 和

((a⊙b)⊙(c⊙d));

3.複雜度計算:

4個數字全排列表示所有數字位置情況:4!=24

3個運算子⊙,每個有6種情況:6^3 = 216

兩種模式 : x2

所以:24 * 216 * 2= 10368

又因為 a+b與a*b分別等價於b+a與b * a;

所以總情況肯定小於10368.

下面是**實現思路:

1.先搜尋全排列,再搜尋運算子。

2.搜尋數字時注意標記每個數字使用一次,而每個運算可以使用多次。

3.兩種模式的計算方法(具體見**)

我自己照著上述思路寫了100多一點行,而在網上看到有大牛簡化寫只用了50左右,佩服,也貼在下方。

這是我自己寫的:

#include 

#include

#include

using

namespace

std;

int num[4];

int used[4] = ;

int nownumber[4] = ;

char ops[6] = ;

char nowops[3];

int ant = 0;

bool makeops(int depth2);

double calc(double sum, char c, double d)

double calctype1(int nownumber, char nowops)

return sum;

}double calctype2(int nownumber, char nowops)

bool makenumber(int depth1)

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

used[i] = 0;}}

return

false;

}bool makeops(int depth2)

else

if (calctype2(nownumber, nowops) == 24)

return

false;

}for (int j = 0; j<6; j++)

}return

false;

}int main()

if(makenumber(0))

else

}return

0;}

這是大牛的簡化:

#include

#include

#include

using

namespace

std;

double a[4];

bool flag;

double so(double a,double b,int k)

return s;

} bool pan(int i,int j,int k)

void solve()

} int main()

while(next_permutation(a,a+4));

if(flag)printf("yes\n");

else

printf("no\n");

} return

0;

}

0825 0903搜尋專題

poj1321 棋盤問題 dfs,雖然並不知道書上或者模板裡的dfs是什麼樣子,但是大概了解。vj掛了 在上面下回再補poj2251 dungeon master 這道題很苦逼的做了好幾天,交了幾十發,用兩種方式均返回tle。然後搜題解,說是要用bfs,啃書,發現原來自己一直不會bfs。寬度優先搜尋...

搜尋專題 S

1 簡單描述 數獨,在乙個9x9的方格中,需要把數字1 9填寫到空格當中,並且使方格的每一行和每一列中都包含1 9這九個數字。同時還要保證,空格中用粗線劃分成9個3x3的方格也同時包含1 9這九個數字。2 思路 include using namespace std struct node node...

搜尋專題 dfs and bfs

搜尋,顧名思義,就是對某樣事物進行尋找。好了我就不多廢話了。搜尋有多種形式,常見的dfs 深度優先搜尋 和bfs 廣度優先搜尋 等等,這也就是今天的主要內容 1.dfs 深度優先搜素,就相當於你去逛街,有很多條街相通,你選擇先走任意一條街,如果沒有自己想要去的店,那麼回到上乙個路口,再選擇一條沒走過...