bzoj3109【CQOI2013】新数独

3109: [cqoi2013]新数独

Time Limit: 10 Sec  Memory Limit: 128 MB

Submit: 365  Solved: 229

[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

dfs的剪枝优化,读入有点麻烦,细心就好了。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
#define HK_reporter main
using namespace std;
int a[10][10],fh[10][10],fl[10][10];
bool flag,vsth[10][10],vstl[10][10],vst[10][10];
inline bool judge(char ch)
{
	return ch==‘<‘||ch==‘>‘||ch==‘v‘||ch==‘^‘;
}
inline void readh(int x)
{
	char ch;
	F(i,1,6)
	{
		ch=getchar();
		while (!judge(ch)) ch=getchar();
		fh[x][(i-1)/2+i]=(ch==‘>‘)?1:0;
	}
}
inline void readl(int x)
{
	char ch;
	F(i,1,9)
	{
		ch=getchar();
		while (!judge(ch)) ch=getchar();
		fl[x][i]=(ch==‘v‘)?1:0;
	}
}
inline void pre()
{
	memset(fh,-1,sizeof(fh));
	memset(fl,-1,sizeof(fl));
	F(i,1,3)
	{
		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);
	}
}
inline int num(int x,int y)
{
	return (x-1)/3*3+(y-1)/3+1;
}
inline void dfs(int x,int y)
{
	if (y>9) x++,y=1;
	if (x>9)
	{
		F(i,1,9)
		{
			F(j,1,8) printf("%d ",a[i][j]);
			printf("%d\n",a[i][9]);
		}
		flag=true;
		return;
	}
	F(i,1,9) if (!vsth[x][i]&&!vstl[y][i]&&!vst[num(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;
		vsth[x][i]=vstl[y][i]=vst[num(x,y)][i]=true;
		a[x][y]=i;
		dfs(x,y+1);
		if (flag) return;
		vsth[x][i]=vstl[y][i]=vst[num(x,y)][i]=false;
	}
}
int HK_reporter()
{
	pre();
	dfs(1,1);
	return 0;
}
时间: 2024-10-12 00:09:40

bzoj3109【CQOI2013】新数独的相关文章

bzoj3109 [cqoi2013]新数独

Description Input 输入一共15行,包含一个新数独的实例.第奇数行包含左右方向的符号(<和>),第偶数行包含上下方向的符号(^和v). Output 输出包含9行,每行9个1~9的数字,以单个空格隔开.输入保证解惟一. Sample Input < > > < > < v v ^ ^ v v ^ ^ ^< < > < > < ^ ^ ^ v ^ ^ ^ v v< < < < >

【搜索】bzoj3109 [cqoi2013]新数独

搜索,没什么好说的.要注意读入. Code: #include<cstdio> #include<cstdlib> using namespace std; const int num[10][10]= {{0,0,0,0,0,0,0,0,0,0}, {0,1,1,1,2,2,2,3,3,3}, {0,1,1,1,2,2,2,3,3,3}, {0,1,1,1,2,2,2,3,3,3}, {0,4,4,4,5,5,5,6,6,6}, {0,4,4,4,5,5,5,6,6,6}, {0

[cqoi2013]新数独

[cqoi2013]新数独 题目 INPUT 输入一共15行,包含一个新数独的实例.第奇数行包含左右方向的符号(<和>),第偶数行包含上下方向的符号(^和v). OUTPUT 输出包含9行,每行9个1~9的数字,以单个空格隔开.输入保证解惟一. SAMPLE INPUT < >   > <  > < v v ^ ^ v v ^ ^ ^ < <   > <  > < ^ ^ ^ v ^ ^ ^ v v < <  

bzoj 3109: [cqoi2013]新数独

1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int ha[10][10],li[10][10],xi[10][10],a[10][10],bh[10][10],bl[10][10],kg; 5 char ch[5]; 6 bool pan(int x,int y,int i) 7 { 8 if(ha[x][i]||li[y][i]||xi[(x-1)/3*3+(y-1)/3][i]) 9 retu

BZOJ 3105: [cqoi2013]新Nim游戏

3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1064  Solved: 624[Submit][Status][Discuss] Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿.拿走最后一根火柴的游戏者胜利. 本题的游

3105: [cqoi2013]新Nim游戏 异或高消 &amp;&amp; 拟阵

3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 535  Solved: 317[Submit][Status][Discuss] Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿.拿走最后一根火柴的游戏者胜利. 本题的游戏

BZOJ3105: [cqoi2013]新Nim游戏

题解: 线性基?类似于向量上的基底. 此题题解戳这里:http://blog.csdn.net/wyfcyx_forever/article/details/39477673 代码: 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<iostream> 7 #incl

BZOJ3105: [cqoi2013]新Nim游戏 博弈论+线性基

一个原来写的题. 既然最后是nim游戏,且玩家是先手,则希望第二回合结束后是一个异或和不为0的局面,这样才能必胜. 所以思考一下我们要在第一回合留下线性基 然后就是求线性基,因为要取走的最少,所以排一下序,从大到小求. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 #include<cmath> 6 #include<algor

【BZOJ3105】[cqoi2013]新Nim游戏 贪心+线性基

[BZOJ3105][cqoi2013]新Nim游戏 Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿.拿走最后一根火柴的游戏者胜利. 本题的游戏稍微有些不同:在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴.可以一堆都不拿,但不可以全部拿走.第二回合也一样,第二个游戏者也有这样一次机会.从第三个回合(又轮到