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

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

藍(lán)橋杯 2016 省賽 A 方格填數(shù)

2019-11-11 04:00:17
字體:
供稿:網(wǎng)友

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

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

#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;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宜兰县| 郯城县| 台山市| 通道| 永清县| 锦州市| 永靖县| 平利县| 大新县| 陇西县| 涞源县| 平潭县| 贵南县| 田林县| 凤山市| 渭源县| 宝鸡市| 华宁县| 高雄市| 仁布县| 肃南| 平远县| 湖州市| 嘉黎县| 建德市| 海口市| 什邡市| 和静县| 资溪县| 内乡县| 南宁市| 班玛县| 青神县| 织金县| 淳安县| 乐昌市| 海伦市| 巴东县| 永胜县| 盘锦市| 榆社县|