zoukankan      html  css  js  c++  java
  • hdu 4069 福州赛区网络赛I DLC ***

    再遇到一个DLC就刷个专题

      1 #include <stdio.h>
      2 #include <string.h>
      3 #include <iostream>
      4 #include <algorithm>
      5 #include <vector>
      6 #include <queue>
      7 #include <set>
      8 #include <map>
      9 #include <string>
     10 #include <math.h>
     11 #include <stdlib.h>
     12 #include <time.h>
     13 using namespace std;
     14 const int N = 9; //3*3数独
     15 const int MaxN = N*N*N + 10;
     16 const int MaxM = N*N*4 + 10;
     17 const int maxnode = MaxN*4 + MaxM + 10;
     18 char g[MaxN];
     19 int cnt;
     20 struct DLX
     21 {
     22     int n,m,size;
     23     int U[maxnode],D[maxnode],R[maxnode],L[maxnode],Row[maxnode],Col[maxnode];
     24     int H[MaxN],S[MaxM];
     25     int ansd,ans[MaxN];
     26     void init(int _n,int _m)
     27     {
     28         n = _n;
     29         m = _m;
     30         for(int i = 0;i <= m;i++)
     31         {
     32             S[i] = 0;
     33             U[i] = D[i] = i;
     34             L[i] = i-1;
     35             R[i] = i+1;
     36         }
     37         R[m] = 0; L[0] = m;
     38         size = m;
     39         for(int i = 1;i <= n;i++)H[i] = -1;
     40     }
     41     void Link(int r,int c)
     42     {
     43         ++S[Col[++size]=c];
     44         Row[size] = r;
     45         D[size] = D[c];
     46         U[D[c]] = size;
     47         U[size] = c;
     48         D[c] = size;
     49         if(H[r] < 0)H[r] = L[size] = R[size] = size;
     50         else
     51         {
     52             R[size] = R[H[r]];
     53             L[R[H[r]]] = size;
     54             L[size] = H[r];
     55             R[H[r]] = size;
     56         }
     57     }
     58     void remove(int c)
     59     {
     60         L[R[c]] = L[c]; R[L[c]] = R[c];
     61         for(int i = D[c];i != c;i = D[i])
     62             for(int j = R[i];j != i;j = R[j])
     63             {
     64                 U[D[j]] = U[j];
     65                 D[U[j]] = D[j];
     66                 --S[Col[j]];
     67             }
     68     }
     69     void resume(int c)
     70     {
     71         for(int i = U[c];i != c;i = U[i])
     72             for(int j = L[i];j != i;j = L[j])
     73                 ++S[Col[U[D[j]]=D[U[j]]=j]];
     74         L[R[c]] = R[L[c]] = c;
     75     }
     76     void Dance(int d)
     77     {
     78         if(cnt > 1)return;
     79         if(R[0] == 0)
     80         {
     81             for(int i = 0;i < d;i++)g[(ans[i]-1)/9] = (ans[i]-1)%9 + '1';
     82             cnt++;
     83             return;
     84         }
     85         int c = R[0];
     86         for(int i = R[0];i != 0;i = R[i])
     87             if(S[i] < S[c])
     88                 c = i;
     89         remove(c);
     90         for(int i = D[c];i != c;i = D[i])
     91         {
     92             ans[d] = Row[i];
     93             for(int j = R[i];j != i;j = R[j])remove(Col[j]);
     94             Dance(d+1);
     95             if(cnt > 1)return;
     96             for(int j = L[i];j != i;j = L[j])resume(Col[j]);
     97         }
     98         resume(c);
     99     }
    100 };
    101 
    102 int id[20][20];
    103 int a[20][20];
    104 void bfs(int sx,int sy,int d)
    105 {
    106     queue<pair<int,int> >q;
    107     q.push(make_pair(sx,sy));
    108     id[sx][sy] = d;
    109     while(!q.empty())
    110     {
    111         pair<int,int> tmp = q.front();
    112         int x = tmp.first;
    113         int y = tmp.second;
    114         q.pop();
    115         if(x > 0 && ((a[x][y]%32)/16) == 0)
    116             if(id[x-1][y] == -1)
    117             {
    118                 id[x-1][y] = d;
    119                 q.push(make_pair(x-1,y));
    120             }
    121         if(x < N-1 && ((a[x][y]%128)/64) == 0)
    122             if(id[x+1][y] == -1)
    123             {
    124                 id[x+1][y] = d;
    125                 q.push(make_pair(x+1,y));
    126             }
    127         if(y > 0 && ((a[x][y])/128) == 0)
    128             if(id[x][y-1] == -1)
    129             {
    130                 id[x][y-1] = d;
    131                 q.push(make_pair(x,y-1));
    132             }
    133         if(y < N-1 && ((a[x][y]%64)/32) == 0)
    134             if(id[x][y+1] == -1)
    135             {
    136                 id[x][y+1] = d;
    137                 q.push(make_pair(x,y+1));
    138             }
    139     }
    140 }
    141 DLX dlx;
    142 
    143 int main()
    144 {
    145     //freopen("in.txt","r",stdin);
    146     //freopen("out.txt","w",stdout);
    147     int T;
    148     scanf("%d",&T);
    149     int iCase = 0;
    150     while(T--)
    151     {
    152         iCase++;
    153         for(int i = 0;i < N;i++)
    154             for(int j = 0;j < N;j++)
    155                 scanf("%d",&a[i][j]);
    156         memset(id,-1,sizeof(id));
    157         int index = 0;
    158         for(int i = 0;i < N;i++)
    159             for(int j = 0;j < N;j++)
    160                 if(id[i][j] == -1)
    161                     bfs(i,j,++index);
    162         dlx.init(N*N*N,N*N*4);
    163         for(int i = 0;i < N;i++)
    164             for(int j = 0;j < N;j++)
    165                 for(int k = 1;k <= N;k++)
    166                 {
    167                     if(a[i][j]%16 != 0 && a[i][j]%16 != k)continue;
    168                     int r = (i*N+j)*N + k;
    169                     int c1 = i*N+j+1;
    170                     int c2 = N*N+i*N+k;
    171                     int c3 = N*N*2+j*N+k;
    172                     int c4 = N*N*3+(id[i][j]-1)*N+k;
    173                     dlx.Link(r,c1);
    174                     dlx.Link(r,c2);
    175                     dlx.Link(r,c3);
    176                     dlx.Link(r,c4);
    177                 }
    178         cnt = 0;
    179         dlx.Dance(0);
    180         printf("Case %d:
    ",iCase);
    181         if(cnt == 0)printf("No solution
    ");
    182         else if(cnt > 1)printf("Multiple Solutions
    ");
    183         else
    184         {
    185             for(int i = 0;i < N*N;i++)
    186             {
    187                 printf("%c",g[i]);
    188                 if(i % N == N - 1)
    189                     printf("
    ");
    190             }
    191         }
    192     }
    193     return 0;
    194 }
  • 相关阅读:
    [转]vim 常用命令
    C语言运算符优先级顺序
    uboot
    linux 驱动开发 不定期更新
    [转]spdk 和nvme 预备知识1
    【转】聊聊 Linux IO
    [转]NVMe协议/ SSD控制器/ linux driver / open channel
    Ubuntu给应用程序创建一个启动图标
    Qt4.8.7+mingw4.8.2 环境搭建
    更改C编译器的缺省字节对齐方式__align(),__attribute((aligned (n))),#pragma pack(n)
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4729990.html
Copyright © 2011-2022 走看看