现在的位置: 首页 > 综合 > 正文

3109: [cqoi2013]新数独 (回溯)

2018年04月25日 ⁄ 综合 ⁄ 共 1071字 ⁄ 字号 评论关闭
#include<iostream>
#include<cstdio>
#define searchnext(x,y) y==9? search(x+1,1):search(x,y+1)
using namespace std;
int ans[10][10];
int cpl[10][10],cpr[10][10];
bool usel[10][10],user[10][10],uses[10][10],flag;
void print()
{
     for(int i=1;i<=9;i++)
     {
       for(int j=1;j<=9;j++)
           {
               printf("%d",ans[i][j]);
               if(j!=9)printf(" ");
           }
          printf("\n");
          }
 }
int cmp(int x,int y){return x>y? 1:-1;}
bool pd(int x,int y,int k)
{
     if(usel[x][k]||user[y][k])return 0;
     if(uses[((x-1)/3)*3+(y-1)/3+1][k])return 0;
     if(cmp(k,ans[x][y-1])!=cpl[x][y]&&cpl[x][y]!=0)return 0;
     if(cmp(k,ans[x-1][y])!=cpr[x][y]&&cpr[x][y]!=0)return 0;
     usel[x][k]=user[y][k]=uses[((x-1)/3)*3+(y-1)/3+1][k]=1;
     return 1;
 }
void search(int x,int y)
{
     if(x==10)
     {flag=1;print();return;}
     if(flag)return;
     for(int i=1;i<=9;i++)
     {
             if(pd(x,y,i))
             {
                 ans[x][y]=i;
                 searchnext(x,y);
                 ans[x][y]=0;
                 usel[x][i]=user[y][i]=uses[((x-1)/3)*3+(y-1)/3+1][i]=0;
             }
     }
 }
int main()
{
    char ch[2];
    for(int i=1;i<=9;i++)
    {
            for(int j=1;j<=9;j++)
            {
                    if(j%3!=0)
                    {
                        scanf("%s",ch);
                        if(ch[0]=='>')cpl[i][j+1]=-1;
                        else cpl[i][j+1]=1;
                    }
            }
            if(i%3!=0)
            for(int j=1;j<=9;j++)
            {
                    scanf("%s",ch);
                    if(ch[0]=='v')cpr[i+1][j]=-1;
                    else cpr[i+1][j]=1;
                    }
            }
    search(1,1);
    return 0;
}

抱歉!评论已关闭.