zoukankan      html  css  js  c++  java
  • 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
    ",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;
    }
    


  • 相关阅读:
    剑指offer-替换空格
    Python replace方法并不改变原字符串
    退出循环break,在while、for、do...while、循环中使用break语句退出当前循环,直接执行后面的代码。
    do{}while()
    while循环
    for循环
    switch用法
    Javascript获取select下拉框选中的的值
    js关于a++ 与++a
    onload属性使用方法
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7141528.html
Copyright © 2011-2022 走看看