关闭

3109: [cqoi2013]新数独

265人阅读 评论(0) 收藏 举报
分类:

3109: [cqoi2013]新数独

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 388  Solved: 239
[Submit][Status][Discuss]

Description

Input

输入一共15行,包含一个新数独的实例。第奇数行包含左右方向的符号(<和>),第偶数行包含上下方向的符号(^和v)。
 

Output

输出包含9行,每行9个1~9的数字,以单个空格隔开。输入保证解惟一。

Sample Input

< > > < > <
v v ^ ^ v v ^ ^ ^
< < > < > <
^ ^ ^ v ^ ^ ^ v v
< < < < > >
> < > > > >
v ^ ^ ^ ^ v v v ^
> > > > < >
v v ^ v ^ v ^ v ^
> < < > > >
< < < < > <
v ^ v v v v ^ ^ v
< > > < < >
^ v v v ^ v ^ v v
< > < > < >

Sample Output

4 9 1 7 3 6 5 2 8
2 3 7 8 1 5 6 4 9
5 6 8 2 4 9 7 3 1
9 1 3 6 5 4 8 7 2
8 5 4 9 7 2 1 6 3
7 2 6 3 8 1 9 5 4
3 4 9 5 6 8 2 1 7
1 8 5 4 2 7 3 9 6
6 7 2 1 9 3 4 8 5

HINT

Source

[Submit][Status][Discuss]




被爆搜教做人

思路很显然,用大小关系和数独本身性质剪枝

但是任何函数都要有返回值

但是任何函数都要有返回值

但是任何函数都要有返回值

dfs如果无结果请return 0


#include<iostream>  
#include<cstdio>  
#include<cstring>  
using namespace std;  

const int dx[4] = {1,0,-1,0};
const int dy[4] = {0,1,0,-1};

int n,m,bo[10][10][10],p[10][10][10][10],L[10][10],R[10][10],a[10][10];  
char ch[20];  
  
void MAKE(int x,int y)  
{  
    for (int i = 0; i < 2; i++) {  
        int t = y*2 - 1;  
        if (ch[t] == '<') p[x][y][x][y+1] = 2,p[x][y+1][x][y] = 1;  
        else p[x][y][x][y+1] = 1,p[x][y+1][x][y] = 2;  
        ++y;
    }  
}  
  
bool dfs(int x,int y)
{
	if (x == 10) {
		for (int i = 1; i <= 9; i++) {
			for (int j = 1; j < 9; j++) printf("%d ",a[i][j]);
			printf("%d",a[i][9]);
			if (i < 9) cout << endl;
		}
		return 1;
	}
	int nx = x,ny = y + 1;
	if (ny == 10) nx = x + 1,ny = 1;  
	int xl = (x-1)/3; xl = xl*3 + 1;
	int xr = (x-1)/3; xr = xr*3 + 3;
	int yl = (y-1)/3; yl = yl*3 + 1;
	int yr = (y-1)/3; yr = yr*3 + 3;
	for (int i = L[x][y]; i <= R[x][y]; i++)
		if (!bo[x][y][i]) {
			if (p[x][y][x-1][y] == 1 && i < a[x-1][y]) continue;
			if (p[x][y][x-1][y] == 2 && i > a[x-1][y]) continue;
			if (p[x][y][x][y-1] == 1 && i < a[x][y-1]) continue;
			if (p[x][y][x][y-1] == 2 && i > a[x][y-1]) continue;
			for (int j = 1; j <= 9; j++) ++bo[x][j][i],++bo[j][y][i];
			for (int j = xl; j <= xr; j++)
				for (int l = yl; l <= yr; l++)
					++bo[j][l][i];
			a[x][y] = i;
			if (dfs(nx,ny)) return 1;
			for (int j = 1; j <= 9; j++) --bo[x][j][i],--bo[j][y][i];
			for (int j = xl; j <= xr; j++)
				for (int l = yl; l <= yr; l++)
					--bo[j][l][i];
		}
	return 0;
}
  
void PRE(int &i,int &x,int &y)
{
            if (i&1) {y = 1;for (int j = 0; j < 3; j++) MAKE(x,y),y += 3;}  
            else {  
                ++x; int t = 0;  
                for (y = 1; y <= 9; y++) {  
                    if (ch[t] == '^') p[x][y][x-1][y] = 1,p[x-1][y][x][y] = 2;  
                    else p[x][y][x-1][y] = 2,p[x-1][y][x][y] = 1;  
                    t += 2;  
                }  
            }  
	
}
  
char GET()
{
	char ret = getchar();
	for (;;) {
		if (ret == '>' || ret == '<' || ret == 'v' || ret == '^') return ret;
		ret = getchar();
	}
}  

int main()  
{  
    #ifdef YZY  
        freopen("yzy.txt","r",stdin);  
    #endif
      
    for (int l = 1; l <= 3; l++) {  
        int x,y; x = y = 1; x += (l-1)*3;  
        for (int i = 1; i <= 5; i++) {  
        	if (i & 1) {
        		ch[1] = GET(); ch[3] = GET();
        		ch[7] = GET(); ch[9] = GET();
        		ch[13] = GET(); ch[15] = GET();
        	}
        	else for (int j = 0; j <= 16; j += 2) ch[j] = GET();
            PRE(i,x,y);
        }  
    }  
    
	for (int i = 1; i <= 9; i++)
		for (int j = 1; j <= 9; j++) {
			L[i][j] = 1; R[i][j] = 9;
			for (int l = 0; l < 4; l++) {
				int xx,yy; 
				xx = i + dx[l];
				yy = i + dy[l];
				if (p[i][j][xx][yy] == 1) ++L[i][j];
				if (p[i][j][xx][yy] == 2) --R[i][j];
			}
		}
		
    dfs(1,1);  
    return 0;  
}  


0
0
查看评论

BZOJ 3109([cqoi2013]新数独-搜索)

虽然想DLX可是建不出图…… 话说最近做了很多看着不可做,最后搜索过的题。。#include<bits/stdc++.h> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n...
  • nike0good
  • nike0good
  • 2016-07-13 20:59
  • 231

bzoj3109【CQOI2013】新数独

DFS水题
  • AaronGZK
  • AaronGZK
  • 2016-04-06 23:30
  • 2101

3109: [cqoi2013]新数独 (回溯)

#include #include #define searchnext(x,y) y==9? search(x+1,1):search(x,y+1) using namespace std; int ans[10][10]; int cpl[10][10],cpr[10][10]; bool us...
  • ndsffx501ccy
  • ndsffx501ccy
  • 2014-07-22 22:56
  • 336

BZOJ 3109 CQOI 2013 新数独

暴力大法好。 读入挺麻烦? 3s好慢QAQ 强行爆搜即可,及时判断行列以及小方格的数字是否使用和大于小于就可以过了。 代码比较丑。 #include #include #define rep(i,j,k) for(int i=j;i<k;i++) using namespace ...
  • huanghongxun
  • huanghongxun
  • 2016-02-07 14:49
  • 568

BZOJ 3109: [cqoi2013]新数独 dfs

3109: [cqoi2013]新数独 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 500  Solved: 306 [Submit][Status][Disc...
  • BlackJack_
  • BlackJack_
  • 2017-08-29 10:35
  • 139

bzoj3109: [cqoi2013]新数独

水暴搜…… /www.lydsy.com/JudgeOnline/problem.php?id=3109
  • u012739450
  • u012739450
  • 2014-06-03 20:23
  • 857

【CQOI2013】新数独 搜索

CQOI2013 NKOJ 2194 新数独题目描述 下面是一个没有数字,只有大小关系(没错!那些尖角都是“大于”符号!)的数独: 除了大小关系外(注意相邻格子不能相同),还需要满足通常的数独规则: 每个格子都是1~9 的数字 每行都是1~9的排列 每列都是1...
  • rgnoH
  • rgnoH
  • 2017-11-09 19:00
  • 45

【CQOI2013】新数独 爆搜

题目描述    题目大意 解数独。。。 样例输入 见代码垃圾markdown编辑器 样例输出 5 3 9 4 6 8 2 1 7 2 4 8 1 9 7 3 5 6 1 6 7 2 3 5 9 8 4 6 8 1 7 4 2 5 9 3 3 7 5 9 1 ...
  • qq_25554407
  • qq_25554407
  • 2017-03-14 10:58
  • 116

[CQOI2013]新数独

题意给你一个没有数字,每个九宫格里有相邻数字大小关系的数独,求解数独。数据保证唯一解。TimeTime Limits:1000msLimits:1000ms MemoryMemory Limits:512000KBLimits:512000KB分析我们可以先处理出每个格子能填的数字的上下界(暴力、...
  • lzxzxx
  • lzxzxx
  • 2015-08-24 16:57
  • 400

BZOJ3105 [CQOI2013]新Nim游戏 Solution

题目大意: 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同)。两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴。可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿。拿走最后一根火柴的游戏者胜利。 本题的游戏稍微有些不同:在第一个回合中,第一个游...
  • wyfcyx_forever
  • wyfcyx_forever
  • 2014-09-22 15:59
  • 2211
    个人资料
    • 访问:202387次
    • 积分:8927
    • 等级:
    • 排名:第2541名
    • 原创:733篇
    • 转载:1篇
    • 译文:0篇
    • 评论:16条
    文章分类
    最新评论