1. 程式人生 > >hdu 1427速算24點(列舉全排列)

hdu 1427速算24點(列舉全排列)



題意: 算24點相信絕大多數人都玩過。就是隨機給你四張牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'運算子以及括號改變運算順序,使得最終運算結果為24(每個數必須且僅能用一次)。遊戲很簡單,但遇到無解的情況往往讓人很鬱悶。你的任務就是針對每一組隨機產生的四張牌,判斷是否有解。我們另外規定,整個計算過程中都不能出現小數

e鳴杯碰到過這道題,當時手算沒算出來現在算報了一箭之仇了吧蛤蛤。但是不一樣的是這道題運算過程中不會出現小數,有一個坑是當輸入是10的時候其實我只讀了1,這也是一開始老wa的原因。

這道題直接暴力有點不和諧,所以可以用next_permutation()來做,總結一下,其實所有運算都可以歸結為兩類,一類是((

[email protected])@c)@d 另一類是 ([email protected])@([email protected])因為只有四個數,所以這麼做沒問題,但當運算元增多的時候就有點麻煩了,這時候可以考慮遞迴來做

程式碼如下:

#include<cstdio>  
#include<cstring>  
#include<cmath>  
#include<cstdlib>  
#include<iostream>  
#include<algorithm>  
#include<vector>  
#include<map>  
#include<queue>  
#include<stack> 
#include<string>
#include<map> 
#include<set>
using namespace std;  
#define LL long long  

const int INF = 100000000;

int a[6];

int sol_input(char ch) {
	if(ch == 'A') return 1;  
    else if(ch == 'J') return 11;  
    else if(ch == 'Q') return 12;  
    else if(ch == 'K') return 13;
    else if(ch == '1') return 10;
    else return ch - '0';
}

int oper(int i, int m, int n) {       //列舉四種運算子 
	if(i == 1) return m + n;
	if(i == 2) return m - n;
	if(i == 3) return m * n;
	if(n == 0 || m % n != 0) return INF;
	else return m / n;
}

bool calcu1(int i, int j, int k) {   //計算順序1 ((
[email protected]
)@c)@d int tmp1 = oper(i, a[0], a[1]); int tmp2 = oper(j, tmp1, a[2]); int tmp3 = oper(k, tmp2, a[3]); if(tmp3 == 24 || tmp3 == -24) return true; return false; } bool calcu2(int i, int j, int k) { //計算順序2 ([email protected])@([email protected]) int tmp1 = oper(i, a[0], a[1]); int tmp2 = oper(k, a[2], a[3]); int tmp3 = oper(j, tmp1, tmp2); if(tmp3 == 24 || tmp3 == -24) return true; return false; } int main() { char s[2]; while(scanf("%s", s) != EOF) { a[0] = sol_input(s[0]); for(int i = 1; i <= 3; i++) { scanf("%s", s); a[i] = sol_input(s[0]); } int flag = 0; sort(a, a+4); do { for(int i = 1; i <= 4; i++) for(int j = 1; j <= 4; j++) for(int k = 1; k <= 4; k++) { if(calcu1(i, j, k) || calcu2(i, j, k)) flag = 1; } } while(next_permutation(a, a+4) && !flag); if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }

相關推薦

hdu 142724列舉排列

 題意: 算24點相信絕大多數人都玩過。就是隨機給你四張牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'運算子以及

HDU 1427 24【數值型DFS】

tar include 任務 div accepted ostream while accep urn 速算24點 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O

TOJ 1344 24排列+dfs

i++ ace family lse pre == ott != 結果 描述 速算24點相信絕大多數人都玩過。就是隨機給你四張牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用‘+‘,‘-‘,‘*‘,‘/‘運算符以及括號改

24 深搜的進一步體會

題目描述 速算24點相信絕大多數人都玩過。就是隨機給你四張牌,包括 A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'運算子以及括號改變運算順序,使得最終運算結果為24(每個數必須且僅能用一次)。

hdu1427 24

mes clear comment com style rii view code else if </pre><pre> //#pragma com

演算法——分蘋果問題和24問題遞迴演算法

#include <iostream>using namespace std;/*分為n>m和n<m兩種情況。當n>m時,一定有盤子為空,此時f(m,n)=f(m,m)當n<=m時,分為有盤子為空時(至少有一個盤子為空):f(m,n-1),

P1691 有重複元素的排列問題 模擬排列

題目描述 設R={r1,r2,……,rn}是要進行排列的n個元素。其中元素r1,r2,……,rn可能相同。使設計一個演算法,列出R的所有不同排列。 給定n以及待排列的n個元素。計算出這n個元素的所有不同排列。 輸入輸出格式 輸入格式: 第1行:元素個數n(1&l

2018hdu杭電多校第五場 hdu6351 Beautiful Now暴力排列

Beautiful Now Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 1677    Accepted

【dfs套dfs套dfs】24

 Luogu P1236 算24點 值得紀念一下 1 #include<cstdio> 2 #include<iostream> 3 #define ri register int 4 #define ll long long 5 usi

P1236 24

題目描述 幾十年前全世界就流行一種數字遊戲,至今仍有人樂此不疲.在中國我們把這種遊戲稱為“算24點”。您作為遊戲者將得到4個1~9之間的自然數作為運算元,而您的任務是對這4個運算元進行適當的算術運算,要求運算結果等於24。 您可以使用的運算只有:+,-,,/,您還可以使用()來改變運算順

C#實現的24遊戲的法的代碼

number putc .text true gen als 算法 ack char s 下面資料是關於C#實現的算24點遊戲的算法的內容,希望能對碼農們有所用處。 using System; using System.Collections.Generic; using

Java 24

import java.util.Scanner;//測試過了,大概的都能算出來,不過bug還是有點多,發現的評論區說一下我再改改public class The_24 {public static void main(String[] args) {int[] a = ne

玩玩24

《玩玩24點》系列: 上篇 中篇 序 在上篇中,我用上位機程式遍歷了4個1~13的數的1820種組合,通過遞迴窮舉計算出其中1362組的24點接法,並轉換為二進位制形式,放到微控制器程式中,減少了微控制器24點遊戲程式的計算量,獲得了不錯的遊戲體驗。 上篇的最後留了一個瘋狂暗示,但時至如今我也沒有實現出來

python例項:解決經典撲克牌遊戲 -- 四張牌湊24

  Hey! Hope you are having a great day so far!   今天想和大家討論的是一道我從這學期cs的期末考試得到靈感的題:Get 24 Poker Game。說到 Get 24 Poker Game,也就是我們通常說的湊24點,大家可能都比較熟悉。但是因為這個遊戲有很多變

python例項:解決經典撲克牌遊戲 -- 四張牌湊24

  Hey! 如果你還沒有看這篇的上文的話,可以去稍稍瞅一眼,會幫助加速理解這一篇裡面涉及到的遞迴結構哦!(上一篇點這裡:《python例項:解決經典撲克牌遊戲 -- 四張牌湊24點 (一)》)   如果你已經看完了第一部分的解析,那我們可以來繼續上道題的第二部分。   根據第一部分的分析,第二部分的難點主要

法整理php語言完成,持續更行中......

== 排序 pre cnblogs 部分 兩個 div function col 一下所有實例中,均在同一個方法中,所以算法使用內部函數完成 歸並排序 1 public function test1Action () { 2 $tmp = 0; 3

HDU 1308 What Day Is It?模擬,日期

else 天數 pre names 一點 val return can 星期幾 解題報告:輸入一個年月日,讓你求出那一天是星期幾,但是做這題之前必須先了解一點歷史。首先在1582年之前,判斷是否是閏年的標準是只要能被四整除就是閏年, 然後在1752年9月2號的後的11天被

法拾遺java描寫敘述】--- 插入排序直接插入排序、希爾排序

ecan itblog insert med image java程序 can rip title 插入排序基本思想 每次將一個待排序的記錄按其keyword大小插入到前面已經拍好序的子文件的適當位置,直到全部記錄插入完畢為止。 直接插入

HDU 6141 I am your Father!最小樹形圖

truct 操作 div blog 直接 .cn clu lld 最小樹形圖 【題目鏈接】 http://acm.hdu.edu.cn/showproblem.php?pid=6141 【題目大意】   給出一個有向圖,求1點為根的最小樹形圖使得第n個點的直

2017中國大學生程序設計競賽 - 網絡選拔賽 HDU 6154 CaoHaha's staff幾何找規律

hdu number ngs malle else ios you friend style Problem Description "You shall not pass!"After shouted out that,the Force Staff appered i