【dfs】益智游戏(2017 特长生 T2)
生活随笔
收集整理的這篇文章主要介紹了
【dfs】益智游戏(2017 特长生 T2)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目大意
給你四個(gè)數(shù)字,問你能否經(jīng)過加減乘除使其結(jié)果為24
解題思路
先暴力枚舉四個(gè)數(shù)字的全排列,然后枚舉運(yùn)算符和括號(hào)
代碼
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; int t, ans, p[10], ss[10], s[10], v[10]; void dfs2(int x) {if (!x){if (s[1] == 24) ans = 1;return;}int g[10], gg[10];for (int i = 1; i <= x; ++i)g[i] = s[i], gg[i] = v[i];for (int i = 1; i <= x; ++i)//枚舉括號(hào),就是枚舉先算哪個(gè)運(yùn)算符{if (v[i] == 1) s[i] += s[i + 1];else if (v[i] == 2) s[i] -= s[i + 1];else if (v[i] == 3) s[i] *= s[i + 1];else if (!s[i + 1]) continue;//除數(shù)不為0else if (s[i] % s[i + 1]) continue;//只能整除else s[i] /= s[i + 1];for (int j = i + 1; j <= x; ++j)s[j] = s[j + 1], v[j - 1] = v[j];//把后面的往前移dfs2(x - 1);if (ans) return;for (int j = 1; j <= x; ++j)//回溯s[j] = g[j], v[j] = gg[j];} } void dfs1(int x) {if (x == 4){dfs2(3);return;}for (int i = 1; i <= 4; ++i)//枚舉符號(hào){v[x] = i;dfs1(x + 1);if (ans) return;} } void dfs3(int x) {if (x > 4){dfs1(1);return;}for (int i = 1; i <= 4; ++i)//枚舉全排列if (!p[i]){s[x] = ss[i];p[i] = 1;dfs3(x + 1);p[i] = 0;} } int main() {scanf("%d", &t);while(t--){scanf("%d%d%d%d", &ss[1], &ss[2], &ss[3], &ss[4]);ans = 0;dfs3(1);printf("%d\n", ans);}return 0; }總結(jié)
以上是生活随笔為你收集整理的【dfs】益智游戏(2017 特长生 T2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一日难再晨的上一句 这句话的出处是哪里
- 下一篇: 吃豆人(luogu 7472/NOI O