# 方法
窮舉法就是,直接暴力的把所有可能都列舉出來,把符合題意的輸出出來。
對,就是這麼的簡單、直接。
所以,題目真的很少,因為沒有鑑別度
真的會考列出的話,會傾向於考 greedy 和 dfs,都是窮舉的強化
# 例題
# a364: 2. 神秘的進位問題
# 題目
,且當 時,,限制,
現在隨便輸入 0~500 隨便一個數,求 abc 的值為何?
# 思路
因為數字只到 500 而且又,所以一開始從 a=0 開始下去跑,把所有的 N 值對應的情況直接記錄下來
之後,在依照題目的要求,查表輸出就好哩
# 程式碼
int a, b, c, abc[501][3] = {}, ok[501] = {}; | |
for(a = 0; a < 20; a ++) { | |
for(b = 0; b < a; b++) { | |
for(c = 0; c < b; c++) { | |
int N = 0; | |
if(a >= 3) N += a*(a-1)*(a-2)/6; | |
if(b >= 2) N += b*(b-1)/2; | |
if(c >= 1) N += c; | |
if(N > 500) break; | |
if(ok[N] == 0) { | |
ok[N] = 1; | |
abc[N][0] = a, abc[N][1] = b, abc[N][2] = c; | |
} | |
} | |
} | |
} |
# a583: 1. 座位距離計算問題
# 題目
給你 M 組座標,求最相近的兩組座標的距離值為何?
一看就知道,水題...
# 思路
把所有點的距離都跑一遍,遇到有更小的就更新,然後輸出出來...
對,窮舉 = 無腦 = 暴力
# 程式碼
int main() { | |
int m, x[20], y[20], i, j; | |
double tmp, mn = 0xffff; | |
scanf("%*d %d", &m); | |
for(i = 0; i < m; i++) { | |
scanf("%d %d", x+i, y+i); | |
for(j = i-1; j >= 0; j--) { | |
tmp = sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2)); | |
if(tmp < mn) mn = tmp; | |
} | |
} | |
printf("%.4lf\n", mn); | |
return 0; | |
} |
# c049: 00356 - Square Pegs And Round Holes
# 題目
在一個邊長為 2n 的正方形棋盤中央畫一個直徑為 2n-1 的圓,以下的圖為 n=3,
寫一個程式判斷有多少個格子是一部份在圓中,以及有多少個格子是完全被包含在圓當中。
# 思路
先去窮舉 1/4 圓的格子情形,再去乘 4
利用畢氏定理判斷格子的四個點是否都在圓內,或部分在園內
# 程式碼
#define AllinRange r1<=range&&r2<=range&&r3<=range&&r4<=range | |
#define PartinRange r1<=range||r2<=range||r3<=range||r4<=range | |
int range = (2*n-1)*(2*n-1); | |
for(int i=0; i<n+1; i++){ | |
for(int j=0; j<n+1; j++){ | |
int r1, r2, r3, r4; // 左下 右下 左上 右上 | |
r1 = 4*(i*i + j*j); | |
r2 = 4*((i+1)*(i+1) + j*j); | |
r3 = 4*(i*i + (j+1)*(j+1)); | |
r4 = 4*((i+1)*(i+1) + (j+1)*(j+1)); | |
if(AllinRange) | |
count_all++; | |
else | |
if(PartinRange) | |
count_part++; | |
else | |
break; | |
} | |
} |