题解 P1074 【靶形数独 】
这是一神题!!!
可能是因为我太弱了,题解都看不太懂QWQ
不过感谢wng老师的提醒,我写出了这个样的的代码。
分析:
这道题是一个搜索(dfs)。很神奇很暴力的题
首先,你需要看懂题目。(可以先去玩下正常的数独,然后基本就明白了....)
其次,应题目要求,我们使用三个数组来标记在此位置填数合不合法,然后有一个非常自然的想法,从每个位置来搜,填数后递归,填完后计算出答案,取最大值。
不过你会发现你爆栈了!!!
所以我开三个数组,记录行列以及九宫格的状态,只有在三个数组中都未出现的值才可以被填入,不过我是反着搜的。
CODE:
// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
#define re register
//define大法好!!!
using namespace std;
bool line[10][10],roway[10][10],nine[10][10];
int a[10][10],b[10][10];
int got[10][10][10];
int ans = -1, score;
inline int math_sign(int x,int y ,int z){
    if(x == 5 && y == 5)
        return 10 * z;
    else if(x >= 4 && x <= 6 && y >= 4 && y <= 6)
        return 9 * z;
    else if(x >= 3 && x <= 7 && y >= 3 && y <= 7)
        return 8 * z;
    else if(x >= 2 && x <= 8 && y >= 2 && y <= 8)
        return 7 * z;
    else return 6 * z;
}//模拟数独的得分方式
inline bool get_score(int x,int y,int z){
    if(roway[x][z] || line[y][z] || nine[(x - 1) / 3 * 3 + (y - 1) / 3][z])
        return 0;
    b[x][y] = z;
    roway[x][z] = line[y][z] = nine[(x - 1) / 3 * 3 + (y - 1) / 3][z] = 1;
    score += got[x][y][z];
    return 1;
}
inline int _read(){
    re int x = 0;
    re int flag = true;
    re int k = getchar();
    while(k != '-' && !isdigit(k))
        k = getchar();
    if(k == '-'){
       k = getchar();
       flag = false;
    }
    while(isdigit(k)){
        x = x * 10 + k - '0';
        k = getchar();
    }
    return (flag ? x : -x);
}//读入优化,不会的可以背一下
inline void del(int x,int y,int z){
    roway[x][z] = line[y][z] = nine[(x - 1) / 3 * 3 + (y - 1)/3][z] = 0;
}
void dfs(int x,int y ){
    if(x == 10 && y == 1){
        ans = max(ans,score);
        return;
    }
    if(b[x][y]){
        if(y == 9)
            dfs(x + 1, 1);
        else
            dfs(x,y + 1);
    }
    else{
        for(int i = 1 ;i <= 9 ;i++){
            int t = score;
            if(get_score(x,y,i)){
                if(y == 9)
                    dfs(x + 1,1);
                else
                    dfs(x,y + 1);
                del(x,y,i);
                score = t;
            }
        }
        b[x][y] = 0;
    }
}
int main(){
    for(int i = 1; i<= 9; i++)
        for(int j = 1; j <= 9 ;j++)
            for(int k = 1; k<= 9 ; k++)
                got[i][j][k] = math_sign(i,j,k);
    for(int i = 9; i > 0 ; i--)
        for(int j = 9; j > 0 ; j--){
            a[i][j] = _read();
            if(a[i][j])
                get_score(i,j,a[i][j]);
        }
    dfs(1,1);
    printf("%d",ans);
    return 0;
}
没错,我开了O2优化,额————其实是因为之前花式被卡,各种TLE,于是我就打开了氧气罐子优化QAQ。。。
祝大家早日AC,不再TLE。(点个赞吧)
题解 P1074 【靶形数独 】的更多相关文章
- P1074 靶形数独
		
P1074 靶形数独正着搜80分,完全倒置95分,完全倒置后左右再倒置,就会A掉,到时候脑洞要大一些. #include<iostream> #include<cstdio> ...
 - 洛谷——P1074 靶形数独
		
P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z ...
 - P1074 靶形数独题解
		
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...
 - 洛谷P1074 靶形数独 [搜索]
		
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...
 - 洛谷 P1074 靶形数独 Label:search 不会
		
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
 - P1074 靶形数独  dfs回溯法
		
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...
 - [洛谷P1074] 靶形数独
		
洛谷题目链接:靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博 ...
 - 洛谷 P1074 靶形数独
		
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
 - [NOIP2009] 提高组 洛谷P1074 靶形数独
		
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
 - luogu P1074 靶形数独
		
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
 
随机推荐
- 解决SurfaceView调用setZOrderOnTop(true)遮挡其他控件
			
解决SurfaceView调用setZOrderOnTop(true)遮挡其他控件的问题 http://marller.blog.51cto.com/8699646/1762028 FAQ: Surf ...
 - Android中EditText显示明文与密码的两种方式
			
效果图如下所述: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and ...
 - bug2 The method of type must override a superclass method解决方式(去掉@override可以)
			
@Override 时出错误: 解决办法是: 一. 因为你的Co ...
 - 130. Surrounded Regions(M)
			
130.Add to List 130. Surrounded Regions Given a 2D board containing 'X' and 'O' (the letter O), capt ...
 - Java poi读取,写入Excel2003
			
Java poi读取,写入Excel2003 相关阅读:poi读写Excel2007:http://www.cnblogs.com/gavinYang/p/3576741.htmljxl读写excel ...
 - bzoj千题计划127:bzoj1041: [HAOI2008]圆上的整点
			
http://www.lydsy.com/JudgeOnline/problem.php?id=1041 设 X>0 ,Y>0 X^2 + Y^2 = R^2 X^2 = R^2-Y^2 ...
 - ZeroMQ API(七) 安全
			
1.无安全性:zmq_null(7) 1.1 名称 zmq_null - 没有安全性或机密性 1.2 概要 NULL机制由ZMTP 3.0规范定义:http://rfc.zeromq.org/spec ...
 - jquery中美元符号命名冲突问题解决
			
在Jquery中,$是JQuery的别名,所有使用$的地方也都可以使用JQuery来替换,如$('#msg')等同于JQuery('#msg') 的写法.然而,当我们引入多个js库后,在另外一个js库 ...
 - Linuc学习3-输入和输出重定向
			
已打开的文件描述符在fork和exec调用后保留下来,我们可以利用对进程这方面知识点的理解来改变程序的行为. 这个例子涉及一个过滤程序:它从标准输入读取数据,然后向标准输出写数据,同时在输入和输出之间 ...
 - java反射三种获得类类型的方法
			
public class Test { public static void main(String[] args) { Test t=new Test();//所有的类都是Class类的实例(类类型 ...