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 深度優先搜素,就相當於你去逛街,有很多條街相通,你選擇先走任意一條街,如果沒有自己想要去的店,那麼回到上乙個路口,再選擇一條沒走過...