p1074 靶形數獨
比賽的要求是:每個人必須完成乙個給定的數獨(每個給定數獨可能有不同的填法),而且要爭取更高的總分數。而這個總分數即每個方格上的分值和完成這個數獨時填在相應格上的數字的乘積的總和
輸入格式:
一共 99 行。每行99個整數(每個數都在 0-9的範圍內),表示乙個尚未填滿的數獨方格,未填的空格用「00」表示。每兩個數字之間用乙個空格隔開。
輸出格式:
輸出共 11 行。輸出可以得到的靶形數獨的最高分數。如果這個數獨無解,則輸出整數-1−1。
輸入樣例#1: 複製
7 0 0 9 0 0 0 0 1輸出樣例#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
2829輸入樣例#2: 複製
0 0 0 7 0 2 4 5 3輸出樣例#2: 複製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
2852【資料範圍】
40%的資料,數獨中非 00 數的個數不少於3030。
80%的資料,數獨中非 00 數的個數不少於2626。
100%的資料,數獨中非00數的個數不少於2424。
noip 2009 提高組 第四題
題解:迭代搜素
如果剩下的格仔我全部填九得到的分都沒有當前的分高,停止搜尋
按照數獨的思想,要先從格仔剩的少的地方填
對於第乙個剪枝我每次都重新搜了一遍,後來發現可以預先處理,每次減掉乙個格仔的貢獻(自己太也sb了)
還可以用位運算更快
#include#includeview code#include
#include
using
namespace
std;
const
int m = 3e5 + 5, p =3e5;
int a[12][12], tot[12], z[12
];int banx[12], bany[12], ban[12], bin[12
];int id[12][12] =,,,
,,,,
,,};int sc[12][12] =,,,
,,,,
,,};int ans = -1
, res;
void dfs(int dep, int sum, int
y)
if(ans != -1 && sum + res <= ans) return
;
int x = z[dep], tmp = 0
;
while(a[x][y])y++;
if(y == 10) dfs(dep+1, sum, 1
);
else
}
}bool cmp(int a, int b)
intmain()
else res += 9 *sc[i][j];
}for(int i = 1; i <= 9; i++)z[i] =i;
sort(z + 1, z + 1 + 9
, cmp);
if(fg)return !printf("
-1\n");
int xx = 1, yy = 1
;
while(tot[z[xx]] == 9)xx++;
while(a[z[xx]][yy])yy++;
dfs(xx,
0, yy);
if(ans == -1) printf("-1"
);
else printf("
%d\n
",ans +now);
}
P1074 靶形數獨
小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向 z 博士請教,z 博士拿出了他最近發明的 靶形數獨 作為這兩個孩子比試的題目。靶形數獨的方格同普通數獨一樣,在 999 格寬 999 格高的大九宮格中有 ...
P1074 靶形數獨
題意 給你乙個未完成的數獨,每個位置上的價值等於數字乘上位置的價值 類似於打靶子 要點 1.巧妙利用打表便於搜尋與判斷 2.貪心思想大量減少搜尋的分支 每行 列 選0的個數少的填,減少了分支 不加此剪枝tle一片。1 剛開始別忘了加上初始的數的value 2 打表注意 0 0 都是 0,因為打錯表找...
P1074 靶形數獨 題解
原題傳送門 不愧是 2009 noip tg t4 連續打了4天的 吸了口氧才通過。前置知識 對於一道數獨題,我們可以先預處理出每一行0的個數,然後從個數最少的行開始做,這樣可以節省大量的時間 因為這些格仔可以填的數字少 對於本題,我一開始的思路是 仿照前置知識預處理,分數進行打表,存在 poi n...