藍橋杯 方格填數(全排列+圖形補齊)

方格填數

如下的10個格子

填入0~9的數字,同一數字不能重復填。要求:連續的兩個數字不能相鄰。
(左右、上下、對角都算相鄰)

一共有多少種可能的填數方案?

請填寫表示方案數目的整數。
注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。

?

解題思路:由題可知,題中的序列是固定的,只有0-9這10個元素,所以可以枚舉其全部全排列,對每個排列根據條件進行篩選。

?

先看一個錯誤答案:520   

(圖一)

一開始想當然的把0-9存入了一維數組中,如圖一,然后發現下標i的上下兩個相鄰位置的坐標為i-4,i+4, 左右為i-1,i+1,

左上右下為i-5,i+5,右上左下為i-3,i+3。于是有了下面的錯誤代碼。

錯誤代碼: ? ? ?(此錯誤代碼運行結果為520)

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 vector<int>v;
 8 int a[8] = { -1,1,-3,3,-4,4,-5,5 };     //一維數組相鄰點的下標
 9 
10 bool judge()
11 {
12     for (int i = 0; i <= 9; ++i)
13     {
14         for (int j = 0; j < 8; ++j)
15         {
16             int k = i + a[j];
17             if (k >= 0 && k <= 9)
18             {
19                 if (abs(v[k] - v[i]) == 1)  //相鄰元素之差的絕對值為1
20                     return false;
21             }
22         }
23     }
24     return true;
25 }
26 
27 int main()
28 {
29     int cnt = 0;
30     for (int i = 0; i <= 9; ++i)
31         v.push_back(i);
32 
33     do
34     {
35         if (judge() == true)
36             cnt++;
37 
38     } while (next_permutation(v.begin(), v.end()));
39 
40     cout << cnt << endl;
41 
42     return 0;
43 }

?

錯因: 忽略了邊界上的坐標,比如7,一直認為左上就是i-5, 但是7-5=2, 但是7并沒有左上方的點。

?

改進: 由于邊界上的坐標比較難處理,所以為了消除邊界的影響,將地圖補全為如下規則圖形,如圖二,這樣就消除了圖二中紅色區域邊界上的影響:

(圖二)

用大小為30的一維數組v保存。?

用一維數組vec保存0-9,對vec進行枚舉全排列,然后將vec[0...9]分別賦值給圖二中的紅色區域,再將非紅色的區域賦值為-10,

對于圖二中的紅色區域,發現下標i的上下兩個相鄰位置的坐標為i-6,i+6, 左右為i-1,i+1,左上右下為i-7,i+7,右上左下為i-5,i+5。

此時再用根據下標獲取其相鄰元素的值,判斷填入的數字是否相鄰即可。

?

改進后的正確代碼:

?

 1 #include <iostream>  
 2 #include <vector>  
 3 #include <algorithm>  
 4 
 5 using namespace std;
 6 
 7 vector<int> v;    //補全的圖形
 8 vector<int> vec;  //未補全的圖形
 9 int a[8] = { -1,1,-5,5,-6,6,-7,7 };    //一維數組相鄰點的下標
10 
11 bool judge(vector<int> v)
12 {
13     for (int i = 8; i <= 21; ++i)
14     {
15         for (int j = 0; j < 8; ++j)    //對其所有相鄰位置進行枚舉
16         {
17             int k = i + a[j];
18             if (abs(v[k] - v[i]) == 1)  //相鄰元素之差的絕對值為1
19                 return false;
20             
21         }
22     }
23     return true;
24 }
25 
26 int main()
27 {
28     int cnt = 0;    //方案數
29     for (int i = 0; i <= 9; ++i)
30         vec.push_back(i);    //一開始必須升序,是為了保證next_permutation能枚舉所有情況的排列
31 
32     for (int i = 0; i <= 29; ++i)
33         v.push_back(-10);
34 
35     do
36     {
37         v[8] = vec[0]; v[9] = vec[1]; v[10] = vec[2]; v[13] = vec[3]; v[14] = vec[4];
38         v[15] = vec[5]; v[16] = vec[6]; v[19] = vec[7]; v[20] = vec[8]; v[21] = vec[9];
39 
40         if (judge(v) == true)
41             cnt++;
42 
43     } while (next_permutation(vec.begin(), vec.end()));
44     
45     cout << cnt << endl;
46 
47     return 0;
48 }

?

正確結果:1580

轉載于:https://www.cnblogs.com/FengZeng666/p/10547864.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387230.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387230.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387230.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

操作系統03進程管理Process_Scheduling

2 Process Scheduling >Type of scheduling >Scheduling Criteria (準則) >Scheduling Algorithm >Real-Time Scheduling (嵌入式系統) 2.1 Learning Objectives By the end of this lecture you should be able to Explain what is Response Time 響應時間-…

花卉分類CNN

tensorflow升級到1.0之后&#xff0c;增加了一些高級模塊&#xff1a; 如tf.layers, tf.metrics, 和tf.losses&#xff0c;使得代碼稍微有些簡化。 任務&#xff1a;花卉分類 版本&#xff1a;tensorflow 1.3 數據&#xff1a;http://download.tensorflow.org/example_images/f…

【模板】可持久化線段樹

可持久化線段樹/主席樹&#xff1a; 顧名思義&#xff0c;該數據結構是可以訪問歷史版本的線段樹。用于解決需要查詢歷史信息的區間問題。 在功能與時間復雜度上與開n棵線段樹無異&#xff0c;然而空間復雜度從$O(n\times nlogn)$降到了$O(nlogn)$。 實現方法&#xff1a; 每次…

skimage庫需要依賴 numpy+mkl 和scipy

skimage庫需要依賴 numpymkl 和scipy1、打開運行&#xff0c;輸入cmd回車&#xff0c;輸入python回車&#xff0c;查看python版本2、在https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy 中&#xff0c;根據自己python版本下載需要的包 &#xff08;因為我的是python 2.7.13 …

操作系統04進程同步與通信

4.1 進程間的相互作用 4.1.1 進程間的聯系資源共享關系相互合作關系臨界資源應互斥訪問。臨界區&#xff1a;不論是硬件臨界資源&#xff0c;還是軟件臨界資源&#xff0c;多個進程必須互斥地對它們進行訪問。把在每個進程中訪問臨界資源的那段代碼稱為臨界資源區。顯然&#x…

oracle遷移到greenplum的方案

oracle數據庫是一種關系型數據庫管理系統&#xff0c;在數據庫領域一直處于領先的地位&#xff0c;適合于大型項目的開發&#xff1b;銀行、電信、電商、金融等各領域都大量使用Oracle數據庫。 greenplum是一款開源的分布式數據庫存儲解決方案&#xff0c;主要關注數據倉庫和BI…

CNN框架的搭建及各個參數的調節

本文代碼下載地址&#xff1a;我的github本文主要講解將CNN應用于人臉識別的流程&#xff0c;程序基于PythonnumpytheanoPIL開發&#xff0c;采用類似LeNet5的CNN模型&#xff0c;應用于olivettifaces人臉數據庫&#xff0c;實現人臉識別的功能&#xff0c;模型的誤差降到了5%以…

操作系統05死鎖

進程管理4--Deadlock and Starvation Concurrency: Deadlock and Starvation 內容提要 >產生死鎖與饑餓的原因 >解決死鎖的方法 >死鎖/同步的經典問題&#xff1a;哲學家進餐問題 Deadlock 系統的一種隨機性錯誤 Permanent blocking of a set of processes that eith…

CNN tensorflow 人臉識別

數據材料這是一個小型的人臉數據庫&#xff0c;一共有40個人&#xff0c;每個人有10張照片作為樣本數據。這些圖片都是黑白照片&#xff0c;意味著這些圖片都只有灰度0-255&#xff0c;沒有rgb三通道。于是我們需要對這張大圖片切分成一個個的小臉。整張圖片大小是1190 942&am…

數據結構01緒論

第一章緒論 1.1 什么是數據結構 數據結構是一門研究非數值計算的程序設計問題中&#xff0c;計算機的操作對象以及他們之間的關系和操作的學科。 面向過程程序數據結構算法 數據結構是介于數學、計算機硬件、計算機軟件三者之間的一門核心課程。 數據結構是程序設計、編譯…

css3動畫、2D與3D效果

1.兼容性 css3針對同一樣式在不同瀏覽器的兼容 需要在樣式屬性前加上內核前綴&#xff1b; 谷歌&#xff08;chrome&#xff09; -webkit-transition: Opera&#xff08;歐鵬&#xff09; -o-transition: Firefox&#xff08;火狐&#xff09; -moz-transition Ie -ms-tr…

ES6學習筆記(六)數組的擴展

1.擴展運算符 1.1含義 擴展運算符&#xff08;spread&#xff09;是三個點&#xff08;...&#xff09;。它好比 rest 參數的逆運算&#xff0c;將一個數組轉為用逗號分隔的參數序列。 console.log(...[1, 2, 3]) // 1 2 3console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5[...doc…

數據結構02線性表

第二章 線性表 C中STL順序表&#xff1a;vector http://blog.csdn.net/weixin_37289816/article/details/54710677鏈表&#xff1a;list http://blog.csdn.net/weixin_37289816/article/details/54773406在數據元素的非空有限集中&#xff1a; (1)存在唯一一個被稱作“第…

訓練一個神經網絡 能讓她認得我

寫個神經網絡&#xff0c;讓她認得我(?????)(Tensorflow,opencv,dlib,cnn,人臉識別) 這段時間正在學習tensorflow的卷積神經網絡部分&#xff0c;為了對卷積神經網絡能夠有一個更深的了解&#xff0c;自己動手實現一個例程是比較好的方式&#xff0c;所以就選了一個這樣比…

數據結構03棧和隊列

第三章棧和隊列 STL棧&#xff1a;stack http://blog.csdn.net/weixin_37289816/article/details/54773495隊列&#xff1a;queue http://blog.csdn.net/weixin_37289816/article/details/54773581priority_queue http://blog.csdn.net/weixin_37289816/article/details/5477…

Java動態編譯執行

在某些情況下&#xff0c;我們需要動態生成java代碼&#xff0c;通過動態編譯&#xff0c;然后執行代碼。JAVA API提供了相應的工具&#xff08;JavaCompiler&#xff09;來實現動態編譯。下面我們通過一個簡單的例子介紹&#xff0c;如何通過JavaCompiler實現java代碼動態編譯…

樹莓派pwm驅動好盈電調及伺服電機

本文講述如何通過樹莓派的硬件PWM控制好盈電調來驅動RC車子的前進后退&#xff0c;以及如何驅動伺服電機來控制車子轉向。 1. 好盈電調簡介 車子上的電調型號為&#xff1a;WP-10BLS-A-RTR&#xff0c;在好盈官網并沒有搜到對應手冊&#xff0c;但找到一份通用RC競速車的電調使…

數據結構04串

第四章 串 STL&#xff1a;string http://blog.csdn.net/weixin_37289816/article/details/54716009計算機上非數值處理的對象基本上是字符串數據。 在不同類型的應用中&#xff0c;字符串具有不同的特點&#xff0c;要有效的實現字符串的處理&#xff0c;必須選用合適的存儲…

CAS單點登錄原理解析

CAS單點登錄原理解析 SSO英文全稱Single Sign On&#xff0c;單點登錄。SSO是在多個應用系統中&#xff0c;用戶只需要登錄一次就可以訪問所有相互信任的應用系統。CAS是一種基于http協議的B/S應用系統單點登錄實現方案&#xff0c;認識CAS之前首先要熟悉http協議、Session與Co…

JDK1.6版添加了新的ScriptEngine類,允許用戶直接執行js代碼。

JDK1.6版添加了新的ScriptEngine類&#xff0c;允許用戶直接執行js代碼。在Java中直接調用js代碼 不能調用瀏覽器中定義的js函數&#xff0c;會拋出異常提示ReferenceError: “alert” is not defined。[java] view plaincopypackage com.sinaapp.manjushri; import javax.sc…