题意
没玩过数独的先看一下规则 (应该没人没玩过吧)
数独盘面是九个宫(以粗实线划分),每一宫又分为九个小格。在空格上填入1-9的数字,使1-9每个数字在每一行、每一列和每一宫中都只出现一次。
你需要填一个数独,但有一点和普通的不一样,你要使填好后数独的分数最高。每个格子获得的分数是 这个格子本身的分值×格子上填的数,整个数独的分数是每个格子的分数之和。每个格子本身的分值如下图,用颜色区分不同区域:
如图,在以下的这个已经填完数字的靶形数独游戏中,总分数为 2829 2829 2829。(下图也是样例的最优解)
样例输入
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
样例输出
2829
数据规模
- 对于 40 % 40\% 40% 的数据,数独中非 0 0 0 数的个数不少于 30 30 30;
- 对于 80 % 80\% 80% 的数据,数独中非 0 0 0 数的个数不少于 26 26 26;
- 对于 100 % 100\% 100% 的数据,数独中非 0 0 0 数的个数不少于 24 24 24。
思路分析
阶段1
可以想到一个较为简单的做法,就是用dfs枚举每个空格填什么,全部填完之后再判断每行、每列、每个宫格是否有重复的,如果没有,就算出分数计入答案。
时间复杂度:最多有 57 57 57 个空格,每个空格有9种填法,也就是9^57,实在是太恐怖了,计算器都不给我一个确切的答案。
阶段2
要避免一些肯定不对的情况,就要一边填,一边判断当前这一行,这一列,这一宫格有没有出现重复的数字,可以建立 b o o l bool bool 数组 f r [ i ] [ j ] fr[i][j] fr[i][j], f c [ i ] [ j ] fc[i][j] fc[i][j], f [ i ] [ j ] f[i][j] f[i][j],分别表示第 i i i 行,第 i i i 列,第 i i i 个宫格是否已经有数字 j j j 了
代码如下:( g e t i d ( x , y ) getid(x,y) getid(x,y<