藍橋云客---九宮幻方

1.九宮幻方 - 藍橋云課

九宮幻方

題目描述

小明最近在教鄰居家的小朋友小學奧數,而最近正好講述到了三階幻方這個部分,三階幻方指的是將1~9不重復的填入一個3 * 3的矩陣當中,使得每一行、每一列和每一條對角線的和都是相同的。

三階幻方又被稱作九宮格,在小學奧數里有一句非常有名的口訣:“二四為肩,六八為足,左三右七,戴九履一,五居其中”,通過這樣的一句口訣就能夠非常完美的構造出一個九宮格來。

492
357
816

有意思的是,所有的三階幻方,都可以通過這樣一個九宮格進行若干鏡像和旋轉操作之后得到。現在小明準備將一個三階幻方(不一定是上圖中的那個)中的一些數抹掉,交給鄰居家的小朋友來進行還原,并且希望她能夠判斷出究竟是不是只有一個解。

而你呢,也被小明交付了同樣的任務,但是不同的是,你需要寫一個程序。

輸入描述

輸入僅包含單組測試數據。

每組測試數據為一個3 * 3的矩陣,其中為0的部分表示被小明抹去的部分。

給出的矩陣至少能還原出一組可行的三階幻方。

輸出描述

如果僅能還原出一組可行的三階幻方,則將其輸出,否則輸出"Too Many"(不包含引號)。

輸入輸出樣例

??示例??

??輸入??

0 7 2
0 5 0
0 3 0

??輸出??

6 7 2
1 5 9
8 3 4

思路:

題目要求,只有一個解那么久輸出這個解,如果多個解就輸出too many。所以我們需要用一個數組儲存第一個解。(題目說了輸入數據會有解的)。

1.因為我們要填空,但是這個二維數組的填空有點麻煩,所以我們可以將每一個需要填空的位置記錄在一個一維數組里面,這樣就比較好爆搜了。

2.利用桶思維保證每一個數字只出現一次

3.check函數檢查


代碼如下:

#include <bits/stdc++.h>
using namespace std;struct Node{int x, y; }pos[10];//儲存位置的數組 
int a[4][4], res[4][4];
bool used[10]; 
int cnt, ans;
bool check()
{for(int i = 1 ; i <= 3 ; i++)//判斷行和列 {int s_row = a[i][1] + a[i][2] + a[i][3];int s_rank = a[1][i] + a[2][i] + a[3][i];if(s_row != 15 || s_rank != 15)return false;	}int s_pd = a[1][1] + a[2][2] + a[3][3];int s_nd = a[1][3] + a[2][2] + a[3][1];if(s_pd != 15 || s_nd != 15)return false;return true; 
}
void dfs(int step) 
{if (ans > 1) return; // 發現多解立即終止if (step > cnt) {if (check()) {ans++;if (ans == 1) // 僅保存第一個解{for(int i = 1 ; i <= 3 ; i++){for(int j = 1 ; j <= 3 ; j++){res[i][j] = a[i][j];				}		   	}	}}return;}int x = pos[step].x, y = pos[step].y;//取出坐標 for (int i = 1; i <= 9; i++) {if (!used[i]) {used[i] = true;a[x][y] = i;dfs(step + 1);used[i] = false;a[x][y] = 0; // 回溯}}
}
int main() 
{for (int i = 1; i <= 3; i++) {for (int j = 1; j <= 3; j++) {cin >> a[i][j];if (a[i][j] == 0) {++cnt;pos[cnt].x = i; // 從1開始記錄待填位置pos[cnt].y = j;} else {used[a[i][j]] = true; // 標記已用數字}}}dfs(1);if (ans == 1) {for (int i = 1; i <= 3; i++) {for (int j = 1; j <= 3; j++) {cout << res[i][j] << " ";}cout << endl;}} else {cout << "Too Many";}return 0;
}

思路:

二維數組寫法,直接模擬x,y負責填數字即可

代碼:

#include <bits/stdc++.h>
using namespace std;struct Node{int x, y; }pos[10];//儲存位置的數組 
int a[4][4], res[4][4];
bool used[10]; 
int cnt, ans;
bool check()
{for(int i = 1 ; i <= 3 ; i++)//判斷行和列 {int s_row = a[i][1] + a[i][2] + a[i][3];int s_rank = a[1][i] + a[2][i] + a[3][i];if(s_row != 15 || s_rank != 15)return false;	}int s_pd = a[1][1] + a[2][2] + a[3][3];int s_nd = a[1][3] + a[2][2] + a[3][1];//對角線 if(s_pd != 15 || s_nd != 15)return false;return true; 
}
void dfs(int x,int y) 
{if (ans > 1) return; // 發現多解立即終止if(y > 3){x++;y = 1;}   if (x > 3) {if (check()) {ans++;if (ans == 1) // 僅保存第一個解{for(int i = 1 ; i <= 3 ; i++){for(int j = 1 ; j <= 3 ; j++){res[i][j] = a[i][j];				}		   	}	}}return;}if(a[x][y] == 0){for(int i = 1 ; i <= 9 ; i++){if (!used[i]) {used[i] = true;a[x][y] = i;dfs(x,y+1);used[i] = false;a[x][y] = 0; // 回溯}}}else{dfs(x,y+1);}}
int main() 
{for (int i = 1; i <= 3; i++) {for (int j = 1; j <= 3; j++) {cin >> a[i][j];if(a[i][j] > 0)used[a[i][j]] = true; }}dfs(1,1);if (ans == 1) {for (int i = 1; i <= 3; i++) {for (int j = 1; j <= 3; j++) {cout << res[i][j] << " ";}cout << endl;}} else {cout << "Too Many";}return 0;
}

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

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

相關文章

OrangePi5Plus開發板不能正確識別USB 3.0 設備 (綠聯HUB和Camera)

1、先插好上電&#xff08;可正確識別&#xff09; 2、上電開機后插入USB 3.0 設備&#xff0c;報錯如下&#xff0c;只能檢測到USB2.0--480M&#xff0c;識別不到USB3.0-5Gbps&#xff0c;重新插拔也不行 Apr 4 21:30:00 orangepi5plus kernel: [ 423.575966] usb 5-1: re…

LiveData 和 MutableLiveData 的區別

LiveData 和 MutableLiveData 的區別 主要在于是否可以修改數據&#xff0c;但它們的工作原理基本相同。下面我們深入對比它們的行為、特性&#xff0c;以及它們在 ViewModel 和 UI 層中的使用方式。 1. LiveData 和 MutableLiveData 的基本區別 特性LiveDataMutableLiveData可…

SDK中窗口調用

存在窗口A和B的win32程序 , 當點擊窗口A中的按鈕后會彈出窗口B #include <windows.h>// 窗口 B 的窗口過程 LRESULT CALLBACK WindowProcB(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg) {case WM_DESTROY:PostQuitMessage(0);break;default:ret…

進行性核上性麻痹:飲食調理為健康護航

進行性核上性麻痹是一種復雜的神經退行性疾病&#xff0c;目前雖無法根治&#xff0c;但合理的健康飲食有助于緩解癥狀、提高患者生活質量。 高蛋白質食物在患者飲食中占據重要地位。魚肉&#xff0c;尤其是富含 Omega-3 脂肪酸的三文魚、鱈魚等&#xff0c;不僅蛋白質含量豐富…

【Windows+Cursor】從0到1配置Arxiv MCP Server,實現論文自主查詢、下載、分析、綜述生成

1. 安裝UV Installation | uv powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" 將安裝路徑添加到環境變量 C:\Users\xxxxxx\.local\bin 2. git clone 代碼 git clone https://github.com/blazickjp/arxiv-mcp-server.git…

WPF 教程:給 TreeView 添加 SelectedItem 雙向綁定支持(MVVM-Friendly)

&#x1f332;WPF 教程&#xff1a;給 TreeView 添加 SelectedItem 雙向綁定支持&#xff08;MVVM-Friendly&#xff09; 在 WPF 的 MVVM 應用中&#xff0c;TreeView 是非常常見的控件&#xff0c;但它有個“頑固”的缺陷&#xff1a; ?它的 SelectedItem 不是依賴屬性&…

Linux環境下內存錯誤問題排查與修復

最近這幾天服務器總是掉線&#xff0c;要查一下服務器的問題。可以首先查看一下計算機硬件&#xff0c;這是一臺某魚上拼湊的服務器&#xff1a; sudo lshw -shortH/W path Device Class Description system NF5270M3 (To be filled by O…

函數和模式化——python

一、模塊和包 將一段代碼保存為應該擴展名為.py 的文件&#xff0c;該文件就是模塊。Python中的模塊分為三種&#xff0c;分別為&#xff1a;內置模塊、第三方模塊和自定義模塊。 內置模塊和第三方模塊又稱為庫內置模塊&#xff0c;有 python 解釋器自帶&#xff0c;不用單獨安…

windows下載安裝遠程桌面工具RealVNC-Server教程(RealVNC_E4_6_1版帶注冊碼)

文章目錄 前言一、下載安裝包二、安裝步驟三、使用VNC-Viewer客戶端遠程連接&#xff0c;輸入ip地址&#xff0c;密碼完成連接 前言 在現代工作和生活中&#xff0c;遠程控制軟件為我們帶來了極大的便利。RealVNC - Server 是一款功能強大的遠程控制服務器軟件&#xff0c;通過…

Android Dagger 2 框架的注解模塊深入剖析 (一)

本人掘金號&#xff0c;歡迎點擊關注&#xff1a;https://juejin.cn/user/4406498335701950 一、引言 在 Android 開發中&#xff0c;依賴注入&#xff08;Dependency Injection&#xff0c;簡稱 DI&#xff09;是一種強大的設計模式&#xff0c;它能夠有效降低代碼的耦合度&…

HTML語言的空值合并

HTML語言的空值合并 引言 在現代Web開發中&#xff0c;HTML&#xff08;超文本標記語言&#xff09;是構建網頁的基礎語言。隨著前端技術的快速發展&#xff0c;開發者們面臨著大量不同的工具和技術&#xff0c;尤其是在數據處理和用戶交互方面。空值合并是一些編程語言中常用…

【數據結構】樹的介紹

目錄 一、樹1.1什么是樹&#xff1f;1.2 樹的概念與結構1.3樹的相關術語1.4 樹形結構實際運用場景 二、二叉樹2.1 概念與結構2.2 特殊的二叉樹2.2.1 滿二叉樹2.2.2 完全二叉樹 個人主頁&#xff0c;點擊這里~ 數據結構專欄&#xff0c;點擊這里~ 一、樹 1.1什么是樹&#xff1…

Muduo網絡庫實現 [十三] - HttpRequest模塊

目錄 設計思路 成員設計 模塊實現 設計思路 首先我們要先知道HTTP的請求的流程是什么樣子的&#xff0c;不然我們會學的很迷糊。對于HTTP請求如何到來以及去往哪里&#xff0c;我們應該很清楚的知道 HTTP請求在服務器系統中的傳遞流程是一個多層次的過程: 客戶端發起請求…

6. RabbitMQ 死信隊列的詳細操作編寫

6. RabbitMQ 死信隊列的詳細操作編寫 文章目錄 6. RabbitMQ 死信隊列的詳細操作編寫1. 死信的概念2. 消息 TTL 過期(觸發死信隊列)3. 隊列超過隊列的最大長度(觸發死信隊列)4. 消息被拒(觸發死信隊列)5. 最后&#xff1a; 1. 死信的概念 先從概念上解釋上搞清楚這個定義&#…

如何使用Selenium進行自動化測試?

&#x1f345; 點擊文末小卡片 &#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 對于很多剛入門的測試新手來說&#xff0c;大家都將自動化測試作為自己職業發展的一個主要階段。可是&#xff0c;在成為一名合格的自動化測試工程師之前&#…

洛谷題單3-P5724 【深基4.習5】求極差 最大跨度值 最大值和最小值的差-python-流程圖重構

題目描述 給出 n n n 和 n n n 個整數 a i a_i ai?&#xff0c;求這 n n n 個整數中的極差是什么。極差的意思是一組數中的最大值減去最小值的差。 輸入格式 第一行輸入一個正整數 n n n&#xff0c;表示整數個數。 第二行輸入 n n n 個整數 a 1 , a 2 … a n a_1,…

STM32智能手表——任務線程部分

RTOS和LVGL我沒學過&#xff0c;但是應該能硬啃這個項目例程 ├─Application/User/Tasks # 用于存放任務線程的函數 │ ├─user_TaskInit.c # 初始化任務 │ ├─user_HardwareInitTask.c # 硬件初始化任務 │ ├─user_RunModeTasks.c…

ubuntu22.04LTS設置中文輸入法

打開搜狗網址直接下載軟件&#xff0c;軟件下載完成后&#xff0c;會彈出安裝教程說明書。 網址:搜狗輸入法linux-首頁搜狗輸入法for linux—支持全拼、簡拼、模糊音、云輸入、皮膚、中英混輸https://shurufa.sogou.com/linux

SQL Server數據庫異常-[SqlException (0x80131904): 執行超時已過期] 操作超時問題及數據庫日志已滿的解決方案

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;獲得2024年博客之星榮譽證書&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開發技術&#xff0c…

php8 ?-> nullsafe 操作符 使用教程

簡介 PHP 8 引入了 ?->&#xff08;Nullsafe 操作符&#xff09;&#xff0c;用于簡化 null 檢查&#xff0c;減少繁瑣的 if 語句或 isset() 代碼&#xff0c;提高可讀性。 ?-> Nullsafe 操作符的作用 在 PHP 7 及以下&#xff0c;訪問對象的屬性或方法時&#xff0…