青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

糯米

TI DaVinci, gstreamer, ffmpeg
隨筆 - 167, 文章 - 0, 評論 - 47, 引用 - 0
數據加載中……

POJ 3120 Sudoku 搜索

題目大意:
給出一個已經完成的數獨,和一個未完成的數獨。
判斷前者能否經過演化后成為后者的解。演化的操作有:
1)改變數字1~9的映射
2)旋轉數獨
3)交換3x9中的行或列
4)交換兩個3x9

解法:
實際上就是常規的搜索,不過代碼難寫點。
4)中共有6*6種情況
3)中共有(6*6*6)*(6*6*6)種情況
在搜索3)的時候,首先固定列,然后枚舉行,這樣就可以節省一些時間。

我的代碼 250ms
#include <stdio.h>
#include 
<string.h>
#include 
<algorithm>
#include 
<cmath>

using namespace std;

int b1[9][9], b2[9][9];
int p3[][3= {
    {
0,1,2},
    {
0,2,1},
    {
1,0,2},
    {
1,2,0},
    {
2,0,1},
    {
2,1,0}
};
int *colseg, *rowseg;
int *col[3];

int check3(int r, int *m);

int check4(int r, int *p, int *m)
{
    
int i, j, k, l;
    
int r1, c1, r2, c2;
    
int v1, v2;
    
int m2[10];

    memcpy(m2, m, 
sizeof(int)*10);
    
for (j = 0; j < 3; j++)
        
for (k = 0; k < 3; k++)
            
for (l = 0; l < 3; l++) {
                r1 
= p[j] + rowseg[r]*3;
                c1 
= colseg[k]*3 + col[k][l];
                r2 
= j + r*3;
                c2 
= k*3 + l;
                v1 
= b1[r1][c1];
                v2 
= b2[r2][c2];
                
if (v2) {
                    
if (!m2[v2])
                        m2[v2] 
= v1;
                    
else if (m2[v2] != v1)
                        
return 0;
                }
            }
    
return check3(r + 1, m2);
}

int check3(int r, int *m)
{
    
int i;
    
    
if (r == 3)
        
return 1;

    
for (i = 0; i < 6; i++
        
if (check4(r, p3[i], m))
            
return 1;

    
return 0;
}

int check2()
{
    
int i, j, k;

    
for (i = 0; i < 6; i++
        
for (j = 0; j < 6; j++)
            
for (k = 0; k < 6; k++) {
                
int m[10= {};
                col[
0= p3[i];
                col[
1= p3[j];
                col[
2= p3[k];
                
if (check3(0, m))
                    
return 1;
            }
    
return 0;
}

int check()
{
    
int i, j;

    
for (i = 0; i < 6; i++) {
        
for (j = 0; j < 6; j++) {
            colseg 
= p3[i];
            rowseg 
= p3[j];
            
if (check2())
                
return 1;
        }
    }
    
return 0;
}

int solve()
{
    
int i, j, b[9][9];

    
if (check())
        
return 1;
    
for (i = 0; i < 9; i++)
        
for (j = 0; j < 9; j++)
            b[i][j] 
= b1[8-j][i];
    memcpy(b1, b, 
sizeof(b));
    
return check();
}

int main()
{
    
int T, i;

    scanf(
"%d"&T);
    
for (; T--; ) {
        
for (i = 0; i < 81++i) scanf(" %1d", b1[i/9]+i%9);
        
for (i = 0; i < 81++i) scanf(" %1d", b2[i/9]+i%9);
        printf(solve() 
? "Yes\n" : "No\n");
    }

    
return 0;
}



標程 79ms
這個很牛逼,原理還沒搞懂!
/* Sample solution for NWERC'06: Sudoku
 * Author: Per Austrin
 * Algorithm: 
 * Fix the position of one 3x3 block at a time, then try all
 * permutations within that block and proceed to the next 3x3-block.
 * Keep a partial remapping of the digits as we go, and break whenever
 * inconsistencies are found.
 
*/
#include 
<cstdio>
#include 
<algorithm>
#include 
<string.h>

using namespace std;

int b1[9][9], b2[9][9];
int brperm[3], bcperm[3];
int rperm[3][3], cperm[3][3];

bool tryperm(int blockrow, int blockcol, int *digmap) {
    
if (blockcol == 3++blockrow, blockcol = 0;
    
if (blockrow == 3return true;

    
for (int i = 0; i < 3++i)
        
if (blockcol == 0 && brperm[i] == -1 || 
                blockcol 
> 0 && brperm[i] == blockrow)
            
for (int j = 0; j < 3++j)
                
if (blockrow == 0 && bcperm[j] == -1 ||
                        blockrow 
> 0 && bcperm[j] == blockcol) {
                    
int rp[3], cp[3];
                    brperm[i] 
= blockrow;
                    bcperm[j] 
= blockcol;

                    
for (int k = 0; k < 3++k) rp[k] = cp[k] = k;
                    
// Check if any of these permutations have already been fixed.
                    if (blockrow > 0) memcpy(cp, cperm[blockcol], sizeof(cp));
                    
if (blockcol > 0) memcpy(rp, rperm[blockrow], sizeof(rp));

                    
do {
                        
do {
                            
// Check that row and column permutations for this block
                            
// are consistent with the current remapping of the digits.
                            bool inconsistent = false;
                            
int ndigmap[10];
                            memcpy(ndigmap, digmap, 
sizeof(int)*10);
                            
for (int r = 0!inconsistent && r < 3++r)
                                
for (int c = 0!inconsistent && c < 3++c) {
                                    
int v1 = b1[3*blockrow + r][3*blockcol + c];    
                                    
int v2 = b2[3*+ rp[r]][3*+ cp[c]];
                                    
if (v2) {
                                        
if (ndigmap[v2] && ndigmap[v2] != v1) inconsistent = true;
                                        ndigmap[v2] 
= v1;
                                    }
                                }
                            memcpy(cperm[blockcol], cp, 
sizeof(cp));
                            memcpy(rperm[blockrow], rp, 
sizeof(rp));
                            
if (!inconsistent && 
                                    tryperm(blockrow, blockcol
+1, ndigmap))
                                
return true;
                        } 
while (blockrow == 0 && next_permutation(cp, cp+3));
                    } 
while (blockcol == 0 && next_permutation(rp, rp+3));

                    
// Restore block permutations
                    if (blockcol == 0) brperm[i] = -1;
                    
if (blockrow == 0) bcperm[j] = -1;
                }
    
return false;
}

int main(void) {
    
int T, i;
    scanf(
"%d"&T);
    
for (; T--; ) {
        
for (i = 0; i < 81++i) scanf(" %1d", b1[i/9]+i%9);
        
for (i = 0; i < 81++i) scanf(" %1d", b2[i/9]+i%9);
        
// Only need to check rotation by 90 degrees since additional
        
// rotation by 180 degrees can be achieved by the permutations.
        for (i = 0; i < 2++i) {
            
int digmap[10];
            
int nb2[9][9];
            
for (int r = 0; r < 9++r)
                
for (int c = 0; c < 9++c)
                    nb2[r][c] 
= b2[c][8-r];
            memcpy(b2, nb2, 
sizeof(b2));
            memset(brperm, 
-1sizeof(brperm));
            memset(bcperm, 
-1sizeof(bcperm));
            memset(digmap, 
0sizeof(digmap));
            
if (tryperm(00, digmap)) {
                printf(
"Yes\n");
                
break;
            }
        }
        
if (i == 2) printf("No\n");
    }
    
return 0;
}



posted on 2011-02-21 20:41 糯米 閱讀(2185) 評論(-1)  編輯 收藏 引用 所屬分類: POJ

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一本色道久久加勒比精品| 老司机免费视频久久| 久久久久99精品国产片| 亚洲美女性视频| 欧美成人日本| 亚洲特级毛片| 欧美aⅴ一区二区三区视频| 在线观看日韩一区| 欧美日本韩国一区二区三区| 在线视频精品一区| 亚洲精品综合久久中文字幕| 亚洲欧美日韩在线观看a三区| 国产精品a级| 久久精品一区二区三区四区| 亚洲最新色图| 欧美成人精品一区| 亚洲欧美激情视频| 国产日韩一区| 欧美日韩国产va另类| 久久精品国产久精国产一老狼| 欧美黄网免费在线观看| 久久gogo国模啪啪人体图| 99这里只有久久精品视频| 亚洲综合首页| 亚洲精品国产精品国自产在线| 亚洲精品网址在线观看| 亚洲尤物在线视频观看| 欧美刺激性大交免费视频| 国内精品久久久久久久果冻传媒| 亚洲天堂久久| 亚洲特色特黄| 久久国产精品黑丝| 性色一区二区| 日韩亚洲精品在线| 一区二区三区精品视频| 亚洲精品少妇网址| 亚洲人成在线免费观看| avtt综合网| 一区二区精品在线| 日韩一区二区福利| 一本久道久久综合婷婷鲸鱼| 欧美一区二区三区免费看 | 亚洲精品欧美精品| 久久久久久久久久久久久久一区| 亚洲乱码国产乱码精品精可以看| 亚洲人成网在线播放| 在线观看成人av电影| 亚洲福利视频一区二区| 亚洲午夜一区二区| 久久国产主播| 久久综合狠狠| 一区二区三区国产精品| 亚洲一区bb| 欧美成人资源| 国产精品你懂的在线欣赏| 国内精品视频久久| 亚洲茄子视频| 欧美日韩国产首页在线观看| 欧美日韩一区二区三区四区在线观看| 欧美三级电影一区| 亚洲欧美日本另类| 久久影院午夜论| 一区二区三区成人| 久久精品99| 99视频热这里只有精品免费| 亚洲视频在线视频| 亚洲九九爱视频| 免费黄网站欧美| 欧美在线观看www| 欧美伊人久久久久久午夜久久久久| 国产精品一区二区三区四区五区 | 国产一区二三区| 99国产精品久久久久久久成人热 | 久久亚洲一区二区| 一区二区三区久久精品| 久久躁日日躁aaaaxxxx| 国产乱理伦片在线观看夜一区| 亚洲国产成人久久综合一区| 欧美在线黄色| 亚洲亚洲精品在线观看| 欧美日韩精品免费| 中日韩美女免费视频网址在线观看| 亚洲电影激情视频网站| 国产精品激情偷乱一区二区∴| 99综合精品| 最新亚洲电影| 欧美www视频| 一区二区三区在线看| 久久精品一区二区三区不卡牛牛| 日韩午夜电影在线观看| 欧美日韩免费一区| 久久精品视频免费| 老司机一区二区| 欧美一区二区在线播放| 免费毛片一区二区三区久久久| 亚洲精品一二| 久久久噜噜噜久久狠狠50岁| 亚洲一二三级电影| 久久久久综合网| 99精品国产福利在线观看免费| 欧美日韩另类在线| 亚洲一区二区在线观看视频| 久久国产精品亚洲77777| 99v久久综合狠狠综合久久| 欧美日韩黄视频| 午夜精品福利在线观看| 亚洲高清激情| 欧美一区二区三区婷婷月色| 亚洲女同性videos| 欧美日韩国产亚洲一区| 久久久夜精品| 国产一区在线看| 欧美一级视频精品观看| 99精品欧美一区| 欧美国产日本韩| 免费视频久久| 国产视频在线观看一区| 性做久久久久久久免费看| 亚洲一区二区在线| 欧美日韩一区不卡| 亚洲精品久久久蜜桃| 亚洲欧洲综合另类| 欧美福利小视频| 日韩视频中文字幕| 亚洲欧美www| 国产欧美一区二区三区另类精品| 亚洲欧美日韩国产中文| 亚洲视频大全| 1000部国产精品成人观看| 欧美一区二区视频观看视频| 久久精品久久99精品久久| 亚洲高清av在线| 国产精品美女一区二区在线观看| 欧美在线看片| 一区二区三区波多野结衣在线观看| 亚洲专区一二三| 亚洲高清免费在线| 国产精品久久久久久av福利软件 | 国产精品久久久久久久午夜| 欧美日韩一区二区三区四区五区| 欧美日韩综合一区| 亚洲免费不卡| 亚洲欧美久久久| 久久综合色影院| 欧美日本精品一区二区三区| 国产伦精品一区二区三区视频孕妇| 国产婷婷色综合av蜜臀av| 一区二区自拍| 一区二区三区四区五区视频 | 影音先锋久久精品| 亚洲精品一区二区三区福利| 亚洲精品欧美在线| 欧美影片第一页| 亚洲狠狠丁香婷婷综合久久久| 一区二区三区产品免费精品久久75| 亚洲欧美福利一区二区| 免播放器亚洲一区| 国产欧美日韩亚洲| 亚洲乱码一区二区| 免费久久精品视频| 亚洲性xxxx| 欧美亚州韩日在线看免费版国语版| 好吊色欧美一区二区三区视频| 亚洲毛片在线| 99精品免费网| 亚洲小说春色综合另类电影| 一区二区三区精品在线| 午夜一区在线| 久久精品二区| 中国av一区| 欧美激情一区二区三区| 在线日韩av永久免费观看| 久久久久久电影| 在线视频一区二区| 欧美精品一区二| 亚洲欧洲日产国产网站| 久久gogo国模啪啪人体图| 久久深夜福利免费观看| 亚洲高清视频一区二区| 一本色道久久综合亚洲精品不| 性久久久久久久| 欧美激情成人在线| 裸体一区二区| 久久嫩草精品久久久久| 欧美午夜精品一区| 亚洲伦理在线免费看| 亚洲精品在线视频观看| 久久久久欧美精品| 久久日韩精品| 在线精品视频一区二区| 亚洲欧美在线免费观看| 国产精品视频在线观看| 亚洲国产欧美一区二区三区久久 | 国产精品影片在线观看| 毛片一区二区| 久久亚洲高清| 新狼窝色av性久久久久久| 亚洲一区二区三区中文字幕在线 | 一区二区三区色| 亚洲国产欧美一区二区三区丁香婷 |