刷题搜索新数独

Posted xwww666666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题搜索新数独相关的知识,希望对你有一定的参考价值。

很暴力的搜索,还没有什么剪枝......

 

心得:

【1】如果只查询和修改,用bool比bitset快

【2】rnt在循环中会比int快

【3】减少简单的函数调用

#include<cstdio>
#include<cstdlib>
#include<bitset>
#include<iostream>
#define rnt register int 
using namespace std;
int ans[10][10];
char mp[2][10][10];//0表示左右,1表示上下 
bool fx[10][10],fy[10][10],fbl[10][10];

void dfs(int x,int y,int bl)//行,列,方格号 
{
    if(bl>9)
    {
        for(rnt i=1;i<=9;i++,printf("
"))
            for(rnt j=1;j<=9;j++)
                printf("%d ",ans[i][j]);
        exit(0);
    }
    //真实坐标 
    int tx=(bl-1)/3*3 +x;
    int ty=(bl-1)%3*3 +y;
    int mn=0,mx=10;
    if(y>1)
        if(mp[0][tx][ty]==>) mx=min(mx,ans[tx][ty-1]);
        else mn=max(mn,ans[tx][ty-1]);
    if(x>1)
        if(mp[1][tx][ty]==v) mx=min(mx,ans[tx-1][ty]);
        else mn=max(mn,ans[tx-1][ty]);
    //可选范围 
    int nxx=x,nxy=y+1,nxbl=bl;
    if(nxy>3) nxy=1,nxx++;
    if(nxx>3) nxx=1,nxbl++;
    
    for(rnt nm=mn+1;nm<mx;nm++ )
    {
        if(fx[tx][nm] || fy[ty][nm] || fbl[bl][nm] ) continue;
        
        ans[tx][ty]=nm;
        fx[tx][nm] = fy[ty][nm] = fbl[bl][nm] =1;
        dfs(nxx,nxy,nxbl);
        fx[tx][nm] = fy[ty][nm] = fbl[bl][nm] =0;
        ans[tx][ty]=0;
    }
}

int main()
{
    for(int i=1;i<=9;i++)
    {
        if(i%3!=1)
        for(int j=1;j<=9;j++)
            cin>>mp[1][i][j];
        for(int k=0;k<3;k++)
            cin>>mp[0][i][k*3+2]>>mp[0][i][k*3+3];
    }
    
    dfs(1,1,1);    
    return 0;
}

以上是关于刷题搜索新数独的主要内容,如果未能解决你的问题,请参考以下文章

3109. [CQOI2013]新数独搜索

[cqoi2013]新数独

bzoj3109CQOI2013新数独

[cqoi2013]新数独

bzoj3109 [cqoi2013]新数独

bzoj 3109: [cqoi2013]新数独