P1074 靶形数独

P1074 靶形数独
正着搜80分,完全倒置95分,完全倒置后左右再倒置,就会A掉,到时候脑洞要大一些。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<queue>
  4 #include<algorithm>
  5 #include<cmath>
  6 #include<ctime>
  7 #include<set>
  8 #include<map>
  9 #include<stack>
 10 #include<cstring>
 11 #define inf 2147483647
 12 #define For(i,a,b) for(register int i=a;i<=b;i++)
 13 #define p(a) putchar(a)
 14 #define g() getchar()
 15 //by war
 16 //2017.11.7
 17 using namespace std;
 18 bool xuse[10][10],yuse[10][10];
 19 int a[10][10];
 20 int ans,n=8;
 21 int tot;
 22 void in(int &x)
 23 {
 24     char c=g();x=0;
 25     while(c<‘0‘||c>‘9‘)c=g();
 26     while(c<=‘9‘&&c>=‘0‘)x=(x<<1)+(x<<3)+c-‘0‘,c=g();
 27 }
 28 void o(int x)
 29 {
 30     if(x>9)o(x/10);
 31     p(x%10+‘0‘);
 32 }
 33
 34 inline bool test(register int step,register int num)
 35 {
 36     register int x=(step/9)/3*3;
 37     register int y=(step%9)/3*3;
 38     For(i,0,2)
 39       For(j,0,2)
 40         if(a[x+i][y+j]==num)
 41         return false;
 42         return true;
 43 }
 44
 45 inline int get()
 46 {
 47     int cnt=0;
 48     int t=5;
 49     For(len,0,4)
 50     {
 51         t++;
 52         For(j,len,n-len)
 53         cnt+=a[len][j]*t;
 54         if(len==4)
 55         break;
 56         For(j,len,n-len)
 57         cnt+=a[n-len][j]*t;
 58
 59         For(i,len+1,n-len-1)
 60         cnt+=a[i][len]*t;
 61
 62         For(i,len+1,n-len-1)
 63         cnt+=a[i][n-len]*t;
 64     }
 65     return cnt;
 66 }
 67
 68 inline void dfs(register int step)
 69 {
 70     if(step==81)
 71     {
 72     ans=max(get(),ans);
 73     tot++;
 74     return;
 75     }
 76     if(a[step/9][step%9]!=0)
 77     dfs(step+1);
 78     else
 79     for(register int i=9;i>=1;i--)
 80     {
 81         if(!xuse[step/9][i]&&!yuse[step%9][i]&&test(step,i))
 82         {
 83             a[step/9][step%9]=i;
 84             xuse[step/9][i]=true;
 85             yuse[step%9][i]=true;
 86             dfs(step+1);
 87             a[step/9][step%9]=0;
 88             xuse[step/9][i]=false;
 89             yuse[step%9][i]=false;
 90         }
 91     }
 92 }
 93
 94 int main()
 95 {
 96     for(register int i=8;i>=0;i--)
 97       For(j,0,8)
 98         {
 99             in(a[i][j]);
100             if(a[i][j]!=0)
101             {
102                 xuse[i][a[i][j]]=true;
103                 yuse[j][a[i][j]]=true;
104             }
105         }
106     dfs(0);
107     if(ans!=0)
108     o(ans);
109     else
110     puts("-1");
111      return 0;
112 }
时间: 2024-11-11 11:12:54

P1074 靶形数独的相关文章

洛谷 P1074 靶形数独

P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目. 靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有 9 个 3 格宽×3 格 高的小九宫格(用粗黑色线隔开的).在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,在其他的空格上填入 1 到 9 的数字.每

洛谷OJ P1074 靶形数独 解题报告

洛谷OJ P1074 靶形数独 解题报告 by MedalPluS 题目描述  小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目. 靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有 9 个 3 格宽×3 格高的小九宫格(用粗黑色线隔开的).在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,

洛谷—— P1074 靶形数独

https://www.luogu.org/problem/show?pid=1074 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目. 靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有 9 个 3 格宽×3 格 高的小九宫格(用粗黑色线隔开的).在这个大九宫格中,有一些数字是已知的,根据

洛谷P1074 靶形数独

题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目. 靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有 9 个 3 格宽×3 格 高的小九宫格(用粗黑色线隔开的).在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,在其他的空格上填入 1 到 9 的数字.每个数字在每个小九宫格内

P1074 靶形数独题解

题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目. 靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有9 个 3 格宽×3 格高的小九宫格(用粗黑色线隔开的).在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,在其他的空格上填入 1 到 9的数字.每个数字在每个小九宫格内不能重复出

Luogu P1074靶形数独

一个需要(存储和优化)技巧的暴力DFS. ·在这里,我们不DFS图的状态:我们选择记录所有空位(记录其位置,属于哪个宫,分数),然后枚举每个空位放 $ 1-9 $ 之内的数. 这里还有一个剪枝的思路:由于DFS是一个树状结构,一层一层往下扩展,所以显然让初始 $ 0 $ 越少的行,DFS的层次越靠上才好.这样能避免大量的扩展枝节,而又不牺牲正确性(因为答案与DFS顺序无关): 所以:首先在读入时记录每行的空位数(初始 $ 0 $ 的数量,保存在数组 n [ 0 ] 中) for(int i(1)

P1074 靶形数独(爆搜)

说是爆搜,却还是有点技巧 首先数独应该有个想法,从最有可能填上数字的那些地方开始 也就是说哪些行0最少,就从那儿开始 为了最大限度地利用已有信息,就先把所有0的位置扣出来单独填 最后别忘了回溯就行 但是这种做法仍然过不了下面这个样例: 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 00 0 0 0 0 0 0

洛谷 【P1074】靶形数独

P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目. 靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有 9 个 3 格宽×3 格 高的小九宫格(用粗黑色线隔开的).在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,在其他的空格上填入 1 到 9 的数字.每

[NOIP2009] 靶形数独

[NOIP2009] 靶形数独 传送门 题目 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出了他最近发明的“靶形数独” ,作为这两个孩子比试的题目. 靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有 9 个 3 格宽×3 格高的小九宫格(用粗黑色线隔开的) .在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,在其他的空格上填入 1到 9 的