NOIP2009靶形數獨

?

試題描述
小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨游戲,好勝的他們想用數獨來一比高低。但普通的數獨對他們來說都過于簡單了,于是他們向 Z 博士請教, Z 博士拿出了他最近發明的“靶形數獨”,作為這兩個孩子比試的題目。
靶形數獨的方格同普通數獨一樣,在 9 格寬 ×9 格高 的大九宮格中有 9 個 3格寬×3 格高 的小九宮格(用粗黑色線隔開的)。在這個大九宮格中,有一些數字是已知的,根據這些數字,利用邏輯推理,在其他的空格上填入 1 到 9 的數字。每個數字在每個小九宮格內不能 重復出現,每個數字在每行、每列也不能重復出現。但靶形數獨有一點和普通數獨不同,即 每一個方格都有一個分值,而且如同一個靶子一樣,離中心越近則分值越高。(如圖)



28.png


上圖具體的分值分布是:里面一格(黃色區域)為 10 分,黃色區域外面的一圈(紅色區域)每個格子為 9 分,再外面一圈(藍色區域)每個格子為 8 分,藍色區域外面一圈(棕色區域)每個格子為 7 分,外面一圈(白色區域)每個格子為 6 分,如上圖所示。
比賽的要求是:每個人必須完成一個給定的數獨(每個給定數獨可能有不同的填法),而且要爭取更高的總分數。而這個總分數即每個方格上的分值和完成這個數獨時填在相應格上的數字的乘積的總和。
如圖,在以下的這個已經填完數字的靶形數獨游戲中,總分數為 2829 。游戲規定,將以總分數的高低決出勝負。

29.png
由于求勝心切,小城找到了善于編程的你,讓你幫他求出,對于給定的靶形數獨,能夠得到的高分數。
輸入
輸入一共?9?行。每行?9個整數(每個數都在?
0—9?的范圍內),表示一個尚未填滿的數獨方格,未填的空格用?0?表示。每兩個數字之間用一個空格隔開。
輸出
輸出共?1?行。

輸出可以得到的靶形數獨的高分數。如果這個數獨無解,則輸出整數??1?。
輸入示例
樣例輸入?1
7?0?0?9?0?0?0?0?1
1?0?0?0?0?5?9?0?0
0?0?0?2?0?0?0?8?0
0?0?5?0?2?0?0?0?3
0?0?0?0?0?0?6?4?8
4?1?3?0?0?0?0?0?0
0?0?7?0?0?2?0?9?0
2?0?1?0?6?0?8?0?4
0?8?0?5?0?4?0?1?2
樣例輸入?2
0?0?0?7?0?2?4?5?3
9?0?0?0?0?8?0?0?0
7?4?0?0?0?5?0?1?0
1?9?5?0?8?0?0?0?0
0?7?0?0?0?0?0?2?5
0?3?0?5?7?9?1?0?8
0?0?0?6?0?1?0?0?0
0?6?0?9?0?0?0?0?1
0?0?0?0?0?0?0?0?6?
輸出示例
樣例輸出?1
2829
樣例輸出?2
2852

因為我們知道分值是多少,所以可以先打出表格,然后美劇所有的情況,進行判斷,最后加點剪枝就可以過

難點在于如何計算出每個數字在哪個宮,(x-1)/3*3+1+(y-1)/3,x代表行,y代表列

還有就是我們OJ是真的慢,最后只好打表QAQ

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
inline int min(int a,int b){return a<b?a:b;}
inline int max(int a,int b){return a>b?a:b;}
inline int rd()
{int x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0';return x*f;
}
inline void write(int x)
{if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0');
}
const int score[10][10]={{0,0,0,0,0,0,0,0,0,0},{0,6,6,6,6,6,6,6,6,6},{0,6,7,7,7,7,7,7,7,6},{0,6,7,8,8,8,8,8,7,6},{0,6,7,8,9,9,9,8,7,6},{0,6,7,8,9,10,9,8,7,6},{0,6,7,8,9,9,9,8,7,6},{0,6,7,8,8,8,8,8,7,6},{0,6,7,7,7,7,7,7,7,6},{0,6,6,6,6,6,6,6,6,6}};
int map[100][100],row[100][100],col[100][100],gong[100][100];
int rcnt[10000],ccnt[10000];
int cnt=0;
int ans=-1;
int id(int x,int y){return (x-1)/3*3+1+(y-1)/3;}
int check()
{int sum=0;for(int i=1;i<=9;i++) for(int j=1;j<=9;j++) sum+=(score[i][j]*map[i][j]);return sum;
}
void dfs(int r,int c,int sum)
{if(sum==81){ans=max(ans,check());return ;}for(int k=1;k<=9;k++){if(row[r][k]!=0||col[c][k]!=0||gong[id(r,c)][k]!=0) continue;row[r][k]=1;col[c][k]=1;gong[id(r,c)][k]=1;rcnt[r]++;ccnt[c]++;map[r][c]=k;int rr,tmpr=-1,cc,tmpc=-1;for(int j=1;j<=9;j++){if(rcnt[j]>tmpr&&rcnt[j]<9){tmpr=rcnt[j];rr=j;}}for(int j=1;j<=9;j++){if(ccnt[j]>tmpc&&map[rr][j]==0){tmpc=ccnt[j];cc=j;}}dfs(rr,cc,sum+1);row[r][k]=0;col[c][k]=0;gong[id(r,c)][k]=0;map[r][c]=0;rcnt[r]--;ccnt[c]--;}return ;
}
int main()
{int i,j;for(i=1;i<=9;i++){for(j=1;j<=9;j++){map[i][j]=rd();if(map[i][j]!=0){row[i][map[i][j]]=1;col[j][map[i][j]]=1;gong[id(i,j)][map[i][j]]=1;rcnt[i]++;ccnt[j]++;cnt++;}}}int r,tmpr=-1,c,tmpc=-1;for(i=1;i<=9;i++){if(rcnt[i]>tmpr&&rcnt[i]<9){tmpr=rcnt[i];r=i;}}for(i=1;i<=9;i++){if(ccnt[i]>tmpc&&map[r][i]==0){tmpc=ccnt[i];c=i;}}dfs(r,c,cnt);printf("%d",ans);return 0;
}

?

轉載于:https://www.cnblogs.com/WWHHTT/p/9755383.html

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

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

相關文章

mysql 1005 - can't create table_關于創建數據表報錯一例(ERROR 1005 Can’t create table (errno: 121))...

問題描述曾遇到創建數據表報錯問題&#xff0c;報錯如下&#xff1a;ERROR 1005 (HY000) at line 18: Cant create table db1.t2 (errno: 121)通過日志查看有一條記錄InnoDB: Error: table db1.t2 already exists in InnoDB internal可見要創建的這個表已經存在&#xff0c;導致…

h5輸出文字write_免費下載:Write是用于手寫的文字處理器

h5輸出文字writeWindows/Mac/Linux/Android: Love the feel of writing by hand, but wish you could use features like copy/paste and undo? Write is a free tool that lets you do just that. Windows / Mac / Linux / Android&#xff1a;喜歡手寫的感覺&#xff0c;但是…

11. IDEA 在同一工作空間創建多個項目

1.創建項目 二.、創建工作空間 JavaWorkspace 1、File-> New Project -> 創建工作空間 JavaWorkspace&#xff0c;并 順便創建項目 JavaOne 2.創建第一個項目后形成的目錄結構如下 三、在已經創建好的工作空間中創建第二個項目 1、File -> New Module -> 創建項目 …

winform 線程監聽兩個目錄下的文件_vb.net 利用.net自帶的GZipStream壓縮或者解壓文件的代碼,不需要任何第三方控件...

網上很少有用VB寫的壓縮文件的代碼&#xff0c;但是&#xff0c;在網絡傳輸&#xff0c;文件下載,打包發布等等方面的需求又比較多&#xff0c;所以&#xff0c;借鑒了一下C#代碼的例子&#xff0c;改造成了VB用的類。另外加上了多層文件夾壓縮解壓。但是&#xff0c;因為時間有…

什么是“ rpcsvchost”,以及為什么它在Mac上運行?

You find something called rpcsvchost while using Activity Monitor to see what’s running on your Mac. What is this process, and should you be worried? In a word, no: rpcsvhost is a core part of macOS. 在使用“活動監視器”查看Mac上正在運行的內容時&#xff…

自定義異常禁用異常堆棧_如何在Mac上禁用或自定義自動更正

自定義異常禁用異常堆棧Sometimes, autocorrect gets it wrong, replacing a word you meant to type with something completely different. You can customize it to fix these issues or disable it altogether. 有時候&#xff0c;自動更正會把它弄錯&#xff0c;用完全不同…

控制dcom程序使用端口_使用VS Code調試.net控制臺應用程序的方法

本文由 比特飛 原創發布&#xff0c;歡迎大家踴躍轉載。轉載請注明本文地址&#xff1a;https://www.byteflying.com/archives/6928。1、概述本文向大家介紹使用Visual Studio Code調試.net控制臺應用程序的方法。2、方案首先在創建好一個控制臺應用程序&#xff0c;再在擴展中…

omnipay支付--支付寶支付

最近負責的項目事關支付寶APP支付 也踩了一些坑 這邊記錄下 以下代碼基于laravel框架下: 生成APP支付參數: $gateway $this->getGateway();$request $gateway->purchase();$request->setBizContent([subject > ,//產品描述out_trade_no > ,//本地訂單號…

4khz的帶寬是指什么意思_揚聲器和耳機的Hz-KHz范圍是什么意思?

4khz的帶寬是指什么意思If you’ve looked at high-end headphones or speakers, you’ve probably noticed numbers on the spec sheet that read something like “20Hz-20KHz.” What do these numbers mean? 如果您看過高端耳機或揚聲器&#xff0c;則可能已經注意到規格表…

mysql兩種引擎的適用場景_MySQL兩種引擎的區別和應用場景

Innodb引擎Innodb引擎提供了對數據庫ACID事務的支持&#xff0c;并且實現了SQL標準的四種隔離級別。該引擎還提供了行級鎖和外鍵約束&#xff0c;它的設計目標是處理大容量數據庫系統&#xff0c;它本身其實就是基于MySQL后臺的完整數據庫系統&#xff0c;MySQL運行時Innodb會在…

linux里查看最耗CPU的線程

1、top后按c查看最耗cpu的進程&#xff0c;得到pid 2、top -Hp pid 查看該進程里的線程資源使用情況&#xff0c;找到最耗資源的線程的pid 3、jstack pid來查看進程的各個線程棧&#xff0c;注意這里的pid是第一步中進程的pid&#xff0c;不是第二步得到的線程id 4、將第二步得…

vlc傳輸_如何使用VLC通過網絡流式傳輸視頻和音樂

vlc傳輸VLC includes a fairly easy-to-use streaming feature that can stream music and videos over a local network or the Internet. You can tune into the stream using VLC or other media players. VLC包括一個相當易于使用的流媒體功能&#xff0c;可以通過本地網絡…

python實現異步的幾種方式_終于搞明白了,異步Python比同步Python究竟快在哪里?...

大家好&#xff0c;你是否聽人們說過&#xff0c;異步 Python 代碼比“普通(或同步)Python 代碼更快&#xff1f; 果真是那樣嗎&#xff1f;同步和異步是什么意思&#xff1f;Web 應用程序通常要處理許多請求&#xff0c;這些請求在短時間內來自不同的客戶端。為避免處理延遲&a…

您可能沒有注意到的7個Ubuntu File Manager功能

The Nautilus file manager included with Ubuntu includes some useful features you may not notice unless you go looking for them. You can create saved searches, mount remote file systems, use tabs in your file manager, and more. Ubuntu隨附的Nautilus文件管理器…

P3174 [HAOI2009]毛毛蟲(樹形dp)

P3174 [HAOI2009]毛毛蟲 題目描述 對于一棵樹&#xff0c;我們可以將某條鏈和與該鏈相連的邊抽出來&#xff0c;看上去就象成一個毛毛蟲&#xff0c;點數越多&#xff0c;毛毛蟲就越大。例如下圖左邊的樹&#xff08;圖 1 &#xff09;抽出一部分就變成了右邊的一個毛毛蟲了&am…

wdcp mysql密碼_WDCP提示無法連接mysql及創建站點提示mysql密碼不正確

一、wdcp系統訪問提示無法連接mysql1、可能是mysql服務沒啟動&#xff0c;首先ssh登陸服務器&#xff0c;然后執行service mysqld restart重啟mysql再訪問試下&#xff0c;如果無法啟動&#xff0c;先用df -lh查看下home分區有沒有掛載&#xff0c;如果沒有掛載嘗試先重啟&…

applecare多少錢?_否,AppleCare +無法覆蓋丟失或被盜的iPhone

applecare多少錢?Losing your iPhone or getting it stolen is pretty common these days, but it’s important to know that while AppleCare covers accidental damage, it doesn’t cover a lost or stolen iPhone. 如今&#xff0c;丟失iPhone或使其被盜很普遍&#xff0…

10以內數的組成分解圖_大班數學教案《10以內數的組成》

大班數學教案《10以內數的組成》作為一名教學工作者&#xff0c;時常需要編寫教案&#xff0c;借助教案可以讓教學工作更科學化。那么什么樣的教案才是好的呢&#xff1f;以下是小編收集整理的大班數學教案《10以內數的組成》&#xff0c;希望能夠幫助到大家。大班數學教案《10…

HDFS文件目錄操作代碼

分布式文件系統HDFS中對文件/目錄的相關操作代碼&#xff0c;整理了一下&#xff0c;大概包括以下部分&#xff1a; 文件夾的新建、刪除、重命名文件夾中子文件和目錄的統計文件的新建及顯示文件內容文件在local和remote間的相互復制定位文件在HDFS中的位置&#xff0c;以及副本…

craigslist_如何設置Craigslist警報(用于電子郵件或SMS)

craigslistWhether you’re looking for apartments or used gadgets on Craigslist, you don’t have to keep checking the website. You can stay on top of things by getting notified when new posts go up that match your searches. 無論您是在Craigslist上尋找公寓還是…