BZOJ 3109: [cqoi2013]新数独 dfs

3109: [cqoi2013]新数独

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 500  Solved: 306
[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

真是一道搜索好题啊。。。。

读入蛮恶心的

然后爆搜。。。


#include<cmath>
#include<ctime>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<string>
#include<bitset>
#include<queue>
#include<map>
#include<set>
using namespace std;

typedef long long ll;

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
	return x*f;
}
void print(int x)
{if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');}

const int N=20;

int fh[N][N],fl[N][N],a[N][N];

void readh(int x)
{
	char ch;
	for(int i=1;i<=6;++i)
	{
		ch=getchar();
		while(ch^'<'&&ch^'>')ch=getchar();
		fh[x][(i-1)/2+i]=ch=='>';
	}
}

void readl(int x)
{
	char ch;
	for(int i=1;i<=9;++i)
	{
		ch=getchar();
		while(ch^'v'&&ch^'^')ch=getchar();
		fl[x][i]=ch=='v';
	}
}

bool flag;

bool vish[N][N],visl[N][N],vis[N][N];

inline int getsq(int x,int y)
{return (x-1)/3*3+(y-1)/3+1;}

void dfs(int x,int y)
{
	if(flag)return ;
	if(y>9)x++,y=1;
	if(x>9)
	{
		for(int j=1;j<=9;++j)
		{for(int i=1;i<9;++i)print(a[j][i]),putchar(' ');print(a[j][9]);puts("");}
		flag=1;return ;
	}
	for(int i=1;i<=9;++i)if(!vish[x][i]&&!visl[y][i]&&!vis[getsq(x,y)][i])
	{
		if(fl[x-1][y]==0&&a[x-1][y]>=i)continue;
		if(fl[x-1][y]==1&&a[x-1][y]<=i)continue;
		if(fh[x][y-1]==0&&a[x][y-1]>=i)continue;
		if(fh[x][y-1]==1&&a[x][y-1]<=i)continue;
		vish[x][i]=visl[y][i]=vis[getsq(x,y)][i]=1;
		a[x][y]=i;
		dfs(x,y+1);
		if(flag)return ;
		vish[x][i]=visl[y][i]=vis[getsq(x,y)][i]=0;
	}
}

int main()
{
	memset(fh,-1,sizeof(fh));memset(fl,-1,sizeof(fl));
	for(int i=1;i<=3;++i)
	{readh((i-1)*3+1);readl((i-1)*3+1);readh((i-1)*3+2);readl((i-1)*3+2);readh((i-1)*3+3);}
	dfs(1,1);
	return 0;
}
/*
 < >   > <   > < 
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
 < >   < >   < > 

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
*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值