【刷题】【搜索】新数独

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

心得:

【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;
}
原文地址:https://www.cnblogs.com/xwww666666/p/11771724.html