C++取整函式ceil(),floor()(例題金蛇狂舞 DFS+取整函式)
原題連結:https://ac.nowcoder.com/acm/contest/11219/D
取整函式
#include <math.h>
使用floor函式。floor(x)返回的是小於或等於x的最大整數。
如: floor(10.5) == 10 floor(-10.5) == -11
使用ceil函式。ceil(x)返回的是大於x的最小整數。
如: ceil(10.5) == 11 ceil(-10.5) ==-10
ceil() 向上取整
cout << "ceil 1.2 = " << ceil(1.2) << endl; //2
floor() 向下取整
cout << "floor 1.2 = " << floor(1.2) << endl; //1
題目描述
使用上取整、下取整、階乘、算術平方根四種運算,完成對一個數字的變換。
輸入描述:
第一行輸入資料組數 T(1≤T≤49)。 接下來每行輸入兩個正整數 x,y(1≤x,y≤7)。輸出描述:
每行輸出一個整數,表示由 x 變換到 y 的最小步數,如果由 x 七步之內不可能變換到 y,輸出 -1 即可。
題解:
使用 上取整、下取整、階乘、算術平方根 四種運算,完成對一個數字的變換。每次階乘計為一步,每次開根號並向上/向下取整計為一步。
我的思路就是用 DFS對 三種情況進行遞迴處理 如果他的步數超過7就return返回,因為考慮到多次使用階乘數 ,開始先列舉1到10的階乘
數,將他們放入陣列,程式碼如下
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define FOR(i, a, b) for (int i = (a); i <= (b); ++i)
#define DEC(i, a, b) for (int i = (a); i >= (b); --i)
const int MAXN = 100000;
using namespace std;
int a,b,x;
ll jc[20]; //儲存階乘數
void dfs(int step, int m) {
if(step > 7 ) return;
if(m == b) {
x = min(x,step);
return;
}
dfs(step+1,ceil(sqrt(m))); //向上取整
dfs(step+1,floor(sqrt(m)));//向下取整
if(m<=10)
dfs(step+1,jc[m]);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t;
ll sum = 1;
for(int i = 1; i<=10; ++i) {
sum*=i;
jc[i] = sum;
}
cin >> t;
while(t--) {
cin >> a >> b;
x = 1 << 30;
dfs(0,a);
if(x != 1<<30)
cout << x << endl;
else
cout << -1 << endl;
}
return 0;
}