国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

藍橋杯 2016 省賽 A 方格填數

2019-11-11 05:28:14
字體:
來源:轉載
供稿:網友

方格填數 如下的10個格子 這里寫圖片描述 填入0~9的數字。要求:連續的兩個數字不能相鄰。 (左右、上下、對角都算相鄰) 一共有多少種可能的填數方案?

DFS就好 但是, 我加了一個list的優化 更要命的是 這個list是用STL實現的 (好吧,其實是我已經懶到手寫鏈表都不會了) 下面普及list的用法 list.erase(it) 這個是函數 返回刪除元素的下一個迭代器 e.g list = [0, 1, 2, 3, 4 …] it = list.erase(list.begin()) *it = 1 同樣 list.insert(it, x)也是個函數,返回的是插入這個元素的迭代器 e.g list = [0, 1, 2, 3, 4 …] it = list.insert(list.begin(), -1) *it = -1 特別注意 是在前面插入的 所以此時 list 變成 [-1, 0, 1, 2, …] 總之這樣,就可以解決藍橋杯里面一切小學奧數問題 并且用了STL, 非常優雅

#include <bits/stdc++.h>using namespace std;list<int> li;int g[20];bool adj(int a, int b){ return abs(a - b) > 1;}bool ok(int i, int x){ if (i == 0) return true; if (i == 1) return adj(x, g[0]); if (i == 2) return adj(x, g[1]); if (i == 3) return adj(x, g[0]); if (i == 4) return adj(x, g[0]) && adj(x, g[1]) && adj(x, g[3]); if (i == 5) return adj(x, g[0]) && adj(x, g[1]) && adj(x, g[2]) && adj(x, g[4]); if (i == 6) return adj(x, g[1]) && adj(x, g[2]) && adj(x, g[5]); if (i == 7) return adj(x, g[3]) && adj(x, g[4]); if (i == 8) return adj(x, g[3]) && adj(x, g[4]) && adj(x, g[5]) && adj(x, g[7]); if (i == 9) return adj(x, g[4]) && adj(x, g[5]) && adj(x, g[6]) && adj(x, g[8]);}int ans = 0;void dfs(int k){ if (k == 10) ans++; for (auto it = li.begin(); it != li.end(); it++) { if (ok(k, *it)) { g[k] = *it; it = li.erase(it); dfs(k + 1); it = li.insert(it, g[k]); } }}int main(){ for (int i = 0; i < 10; i++) { li.push_back(i); } dfs(0); cout << ans << endl;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平原县| 蓝田县| 兴和县| 黄冈市| 东乡县| 台安县| 松潘县| 固镇县| 岳西县| 儋州市| 灵寿县| 综艺| 襄城县| 马鞍山市| 榆林市| 西林县| 邹平县| 涟水县| 谢通门县| 勐海县| 监利县| 蒙城县| 湟中县| 寻乌县| 修文县| 丰镇市| 嘉善县| 河南省| 湖州市| 福州市| 安塞县| 台东市| 麻江县| 津南区| 怀柔区| 舒兰市| 石台县| 时尚| 北京市| 南平市| 东阳市|