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

糯米

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 糯米 閱讀(2189) 評論(-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免费看 | 欧美日韩国产系列| 亚洲夜间福利| 欧美激情1区2区3区| 亚洲最新视频在线| 国产亚洲欧美激情| 欧美日本精品在线| 久久乐国产精品| 亚洲一区二区三区乱码aⅴ蜜桃女| 老司机aⅴ在线精品导航| 午夜精品亚洲| 亚洲欧美三级伦理| 亚洲欧美一区二区精品久久久| 亚洲视频电影在线| 亚洲一区二区在线| 一区二区三区视频观看| 在线日韩av| 亚洲精品国产精品久久清纯直播 | 99亚洲一区二区| 亚洲精品美女91| 亚洲国产mv| 美脚丝袜一区二区三区在线观看| 久久久久久久波多野高潮日日| 欧美一级精品大片| 夜夜精品视频| 99热在线精品观看| 亚洲私人影院| 久久国产精品久久久久久电车| 亚洲一卡久久| 欧美成人蜜桃| 国产婷婷精品| 亚洲精品一区二区三区在线观看| 亚洲日本va午夜在线电影| 亚洲女女做受ⅹxx高潮| 欧美99久久| 午夜国产精品影院在线观看| 欧美+亚洲+精品+三区| 国产三级欧美三级| 99精品国产99久久久久久福利| 久久成人国产精品| 亚洲一区二区三区四区视频| 麻豆国产精品一区二区三区| 欧美日韩四区| 亚洲一区国产精品| 99国产麻豆精品| 欧美日韩国产色视频| 悠悠资源网亚洲青| 欧美主播一区二区三区美女 久久精品人| 老司机免费视频久久| 羞羞漫画18久久大片| 国产日韩欧美综合精品| 亚洲欧美在线观看| 亚洲在线一区二区三区| 久久人人97超碰精品888| 亚洲一区二区三区中文字幕| 欧美日韩国产小视频在线观看| 极品日韩久久| 男男成人高潮片免费网站| 亚洲天堂视频在线观看| 欧美日韩精品免费观看| 亚洲黑丝在线| 亚洲精品黄网在线观看| 欧美理论大片| 亚洲欧美中文在线视频| 性欧美大战久久久久久久久| 欧美精品一区二区三区很污很色的| 亚洲国产精品久久久久秋霞蜜臀| 久久精品免视看| 欧美激情成人在线视频| 亚洲免费电影在线观看| 狠狠色丁香久久婷婷综合丁香 | 亚洲国产精品欧美一二99| 欧美人交a欧美精品| 久久国产精品一区二区三区| 久久av资源网| 亚洲影视在线| 欧美mv日韩mv国产网站app| 久久国产精品久久精品国产| 欧美激情精品久久久久久蜜臀| 亚洲欧美在线看| 欧美日韩成人| 亚洲精选视频在线| 精品不卡一区| 欧美伊人久久久久久午夜久久久久| 在线视频精品一区| 久久亚洲精品中文字幕冲田杏梨| 久久福利资源站| 欧美三级视频在线观看| 99亚洲伊人久久精品影院红桃| 亚洲深夜激情| 欧美黑人在线观看| 经典三级久久| 欧美在线黄色| 久久亚洲不卡| 亚洲精品乱码久久久久久黑人 | 日韩一级精品视频在线观看| 欧美成人官网二区| 野花国产精品入口| 欧美影院久久久| 在线观看国产一区二区| 免费国产自线拍一欧美视频| 亚洲精品国久久99热| 午夜精品久久久久久久| 国产精品专区一| 欧美不卡视频| 亚洲特黄一级片| 欧美激情亚洲综合一区| 亚洲视频欧美视频| 伊人春色精品| 欧美日韩国语| 欧美一区二区三区日韩| 欧美二区在线播放| 99成人免费视频| 一区精品在线| 国产区日韩欧美| 欧美肉体xxxx裸体137大胆| 性欧美video另类hd性玩具| 亚洲国产精品久久久| 久久人人看视频| 亚洲综合色噜噜狠狠| 亚洲一区二区精品在线观看| 黄色一区二区三区四区| 国产精品久久久久久久电影 | 亚洲女同精品视频| 亚洲国产精品女人久久久| 国产精品看片资源| 欧美精品福利| 国产精品久久久久77777| 欧美韩国在线| 欧美视频在线播放| 好看的亚洲午夜视频在线| 国产主播一区二区三区| 国产精品主播| 亚洲人成网站在线观看播放| 亚洲人成网站在线播| 亚洲激情在线观看| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美激情在线播放| 亚洲图片欧美午夜| 91久久久在线| 亚洲国产成人高清精品| 亚洲大胆美女视频| 久久国产精品久久国产精品| 亚洲欧美中文另类| 亚洲精品免费在线| 国产一区二区三区无遮挡| 欧美女同在线视频| 午夜亚洲精品| 午夜一区二区三区不卡视频| 亚洲综合日韩在线| 久久这里只有精品视频首页| 久久久精品一品道一区| 久久99伊人| 亚洲大片av| 亚洲一区精彩视频| 欧美一区二区观看视频| 久久久久久9| 国产在线日韩| 亚洲愉拍自拍另类高清精品| 久久综合狠狠| 亚洲欧美视频在线观看视频| 欧美亚洲免费在线| 亚洲在线日韩| 国产欧美一区二区精品性 | 国产欧美一级| 午夜精品一区二区在线观看| 毛片基地黄久久久久久天堂| 欧美大尺度在线| 国产精品高清网站| 欧美日韩在线一区| 影院欧美亚洲| 久久久精品久久久久| 久久动漫亚洲| 国产乱码精品一区二区三区不卡| 一区二区三区日韩精品视频| 亚洲福利视频三区| 欧美日韩另类综合| 亚洲一二三区在线| 欧美中文在线字幕| 欧美视频观看一区| 亚洲青色在线| 麻豆精品网站| 欧美一级播放| 亚洲成人在线网| 亚洲人成网站精品片在线观看| 欧美电影打屁股sp| 久久久久久综合| 欧美成人国产| 亚洲永久免费观看| 先锋影音国产精品| 亚洲一二三四区| 久久久久久久久久久一区 | 久久免费国产精品| 伊人成人在线| 牛牛精品成人免费视频| 欧美日韩在线视频首页| 久久精品99国产精品酒店日本| 国产精品高潮呻吟久久av黑人|