一道暴力列舉題Win32版本示例

2021-10-24 08:49:05 字數 3449 閱讀 7106

來看乙個問題;該問題的解法是 暴力列舉;這大概是acm方面的;名稱叫火柴棒等式

給你n根火柴棍,你可以拼出多少個形如「a+b=c」的等式?等式中的a、b、c是用火柴棍拼出的整數(若該數非零,則最高位不能是0)。用火柴棍拼數字0-9的拼法如圖所示:

注意:1. 加號與等號各自需要兩根火柴棍

2. 如果a≠b,則a+b=c與b+a=c視為不同的等式(a、b、c≥0)

3. n根火柴棍必須全部用上

輸入 輸入乙個整數n(n≤24)。

輸出 輸出能拼成的不同等式的數目。 

問題簡述:給你n(n<=24)根火柴棒,叫你拼出 「a + b = c」這樣的等式,求方案數。

思路:由於題目中已經給出,最多有24根火柴,而等號和加號各用4根的前提下,a\b\c三個數則總共只有20根火柴,資料範圍較小,可以用列舉法列舉a、b。這個時候我們發現,0-9這10個數字所用的火柴數為:6,2,5,5,4,5,6,3,7,6,很明顯數字1用的火柴棒最少只要2根,不妨讓b為1,那麼a和c最多可以使用18根火柴,而c>=a,滿足條件的a的最大取值為1111。所以列舉a和b的範圍是從0~1111。

為了加快速度,可以將0到2222的所有整數需要的火柴棒數目提前算好儲存在陣列中。

先來理解一下題目;

火柴24根,加號和等號用去4根,剩下20根可以拼數字;這沒問題;

0-9這10個數字所用的火柴數為:6,2,5,5,4,5,6,3,7,6;數字1用的火柴棒最少只要2根;這沒問題;

如果b為1,那麼a和c最多可以使用18根火柴;這沒問題;20-2=18;

因為c>=a,滿足條件的a的最大取值為1111;為什麼a的最大取值為1111?大概是拼a最多能用8根;

列舉a和b的範圍是從0~1111;我還不太理解;

將0到2222的所有整數需要的火柴棒數目提前算好儲存在陣列中;不太理解;

下面根據網上程式做乙個win32版本;n=24;

#include #include "resource.h"

lresult callback windowprocedure (hwnd, uint, wparam, lparam);

hinstance hinst;

tchar szclassname = text("hcdemo");

int a[2223]=;

const int b[10]=;

int winapi

winmain (hinstance hthisinstance,

hinstance hprevinstance,

lpstr lpszargument,

int nfunsterstil)

return messages.wparam;}

lresult callback

windowprocedure (hwnd hwnd, uint message, wparam wparam, lparam lparam)

col=col+1;

row=0;

}wsprintf(szbuffer, "數目:%d",sum);

textout(hdc,1,1,szbuffer,lstrlen(szbuffer));

break;

case idm_about:

text ("hcdemo"), mb_ok | mb_iconinformation);

break;

case idm_exit:

destroywindow(hwnd);

break;

default:

return defwindowproc(hwnd, message, wparam, lparam);

}break;

case wm_create:

break;

case wm_paint:

hdc = beginpaint(hwnd, &ps);

getclientrect(hwnd, &rt);

endpaint(hwnd, &ps);

break;

case wm_destroy:

postquitmessage (0);

break;

default:

return defwindowproc (hwnd, message, wparam, lparam);

}return 0;

}int need(int n)

return num;

}

輸出如下;當n=24,方案數是128;

把程式裡面的a、b、c用加號和等號輸出了;結果如上;

此程式我還不太理解;程式裡面的a、b、c,可能是火柴棒根數;

源程式如下;有興趣自己研究;

#include using namespace std;

int a[2223]=;

const int b[10]=;

//計算自然數n所需要的火柴數

int need(int n)

return num;

}int main( )

}cout參閱網上相關資料或此;

工程;

資源和標頭檔案;

#include "resource.h"

#include /

//// menu

//idc_hcdemo menu

begin

popup "&file"

begin

menuitem "暴力列舉示例", idm_hc

menuitem "e&xit", idm_exit

endpopup "&help"

begin

menuitem "&about ...", idm_about

endend

#define 	idm_exit		10001

#define idm_about 10002

#define idc_hcdemo 10101

#define idd_aboutbox 10102

#define idm_hc 40001

槍俠(一道暴力題)

由於r l 10 r l 10 r l 1 0,所以考慮列舉每一段的長度len,又因為字符集並不大,根據抽屜原理,總共最多有51個段。所以我們列舉len,計算與每個點最早衝突的點的位置,就是把點按mod lenmod len modlen 分組。然後列舉起點,看每個起點可以往後擴充套件到什麼位置 用...

題解 一道數學題 加強版

題目傳送門 給出乙個二元函式,滿足 f k,x begin 1 x 1 sum f k,i x k x 1 end 給出 n,k 求出 f k,n n le 10 k le 10 6 借鑑了master.yi的思路 但是他裡面有個式子似乎寫錯了 我們首先可以得到轉移式 f k,x f k,x 1 x...

一道利用遞迴實現的集合列舉演算法題

有乙個集合m是這樣生成的 1 已知 k 是集合 m 的元素 2 如果 y 是 m 的元素,那麼,2y 1 和 3y 1 都是 m 的元素 3 除了上述二種情況外,沒有別的數能夠成為 m 的乙個元素。問題 任意給定 k 和 x,請判斷 x 是否是 m 的元素。這裡的 k是無符號整數,x 不大於 100...