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

糯米

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

POJ 3120 Sudoku 搜索

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

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

我的代碼 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;
}



標(biāo)程 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 糯米 閱讀(2193) 評論(-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>
            免费观看30秒视频久久| 亚洲区第一页| 宅男噜噜噜66一区二区| 136国产福利精品导航网址| 亚洲午夜激情网页| 亚洲美女在线观看| 免播放器亚洲一区| 麻豆av一区二区三区久久| 国产精品视频xxxx| 亚洲美女网站| 亚洲精品九九| 免费视频最近日韩| 欧美成人性生活| 激情久久五月天| 欧美一区二区三区久久精品茉莉花 | 亚洲网站视频| 一区二区三区免费观看| 欧美激情精品久久久久久蜜臀| 久久久国产一区二区| 国产精品日韩精品欧美在线| 一区二区三区日韩精品视频| 国产精品99久久久久久www| 欧美高清在线一区| 亚洲国产黄色| 91久久国产综合久久91精品网站| 久久久久久综合| 米奇777在线欧美播放| 亚洲专区一区二区三区| 亚洲一区二区三区精品在线| 欧美精品偷拍| 在线天堂一区av电影| 亚洲一区中文| 国产午夜亚洲精品羞羞网站| 欧美成人有码| 亚洲精品国产精品乱码不99按摩 | 米奇777在线欧美播放| 女生裸体视频一区二区三区| 伊人精品在线| 亚洲视频在线视频| 欧美一区二区三区精品电影| 国产一区二区你懂的| 久久久久久亚洲精品中文字幕| 久久人人超碰| 亚洲精品一区二区三区婷婷月| 欧美激情成人在线视频| 一区二区久久久久久| 亚洲欧美视频在线观看| 国产午夜精品视频| 久久三级视频| 久久精品国产精品亚洲综合| 韩日在线一区| 欧美韩国日本综合| 亚洲一区二区在线播放| 久久亚洲精品一区二区| 亚洲精品国产系列| 国产精品乱码一区二区三区| 久久裸体视频| 99re亚洲国产精品| 久久精品一区| 99国产精品久久久久老师| 国产精品久久久久久av福利软件| 久久久精品视频成人| 亚洲人成亚洲人成在线观看图片| 性做久久久久久久免费看| 亚洲第一区色| 国产精品区一区| 欧美国产日韩一区二区| 午夜精品在线观看| 最新国产精品拍自在线播放| 欧美在线综合| 99riav久久精品riav| 国内精品美女在线观看| 欧美日本一区二区高清播放视频| 新67194成人永久网站| 最新成人av网站| 久久在线视频在线| 亚洲欧美另类中文字幕| 亚洲激情综合| 国内成+人亚洲+欧美+综合在线| 欧美激情精品久久久久久免费印度| 亚洲欧美日韩中文视频| 亚洲美女91| 亚洲成色精品| 99re这里只有精品6| 精品88久久久久88久久久| 国产精品成人观看视频免费 | 久久狠狠久久综合桃花| 亚洲视频中文字幕| 亚洲日韩欧美视频| 欧美成人dvd在线视频| 欧美专区在线播放| 亚洲欧美日韩中文在线制服| 日韩一级免费观看| 亚洲韩国一区二区三区| 精品1区2区| 激情久久综合| 狠狠色丁香久久婷婷综合_中| 国产精品男女猛烈高潮激情| 欧美视频网址| 欧美日韩四区| 欧美日韩国产一区精品一区 | 麻豆精品在线观看| 久久久精品国产99久久精品芒果| 欧美亚洲视频一区二区| 亚洲综合色网站| 亚洲欧美中文另类| 亚洲男人天堂2024| 亚洲在线电影| 亚洲欧美色婷婷| 欧美一乱一性一交一视频| 亚洲欧美国产高清| 欧美制服第一页| 久久久免费精品视频| 久久综合一区二区| 美女精品视频一区| 欧美激情一区二区三区四区| 欧美精品网站| 国产精品美女主播在线观看纯欲| 国产精品一区=区| 欧美成人午夜激情| 欧美极品一区二区三区| 欧美视频在线视频| 国产精品日日摸夜夜摸av| 国产亚洲精久久久久久| 狠狠久久亚洲欧美| 91久久国产综合久久| 在线视频一区观看| 久久国产手机看片| 欧美va天堂在线| 亚洲麻豆av| 午夜精品电影| 免费中文字幕日韩欧美| 欧美视频在线看| 国产一区二区三区四区在线观看| 亚洲大胆人体视频| 亚洲一区二区三区精品在线观看| 欧美一区二视频| 欧美成人精品激情在线观看| 亚洲人成亚洲人成在线观看| 亚洲欧美电影院| 欧美福利视频在线观看| 国产精品福利影院| 伊人久久综合| 亚洲伊人观看| 免费视频一区| 国产精品99久久久久久www| 久久精品国产v日韩v亚洲| 欧美激情亚洲一区| 国产一区二区高清不卡| 一本不卡影院| 米奇777在线欧美播放| 一区二区三区精品视频在线观看| 久久精品亚洲热| 国产精品久久婷婷六月丁香| 亚洲国产精品99久久久久久久久| 亚洲免费综合| 亚洲黄色大片| 久久精品国产视频| 欧美午夜精品| 亚洲精品美女在线| 久久久免费精品视频| 在线亚洲欧美专区二区| 乱中年女人伦av一区二区| 国产欧美日韩免费看aⅴ视频| 91久久国产综合久久蜜月精品| 欧美在线3区| 亚洲精品在线免费观看视频| 久久人人爽国产| 国产欧美日韩在线| 亚洲性感美女99在线| 欧美成人午夜剧场免费观看| 性做久久久久久| 国产精品女主播| 亚洲小说春色综合另类电影| 亚洲国产黄色片| 久久―日本道色综合久久| 国产日韩欧美精品| 午夜精品偷拍| 亚洲性色视频| 欧美午夜不卡视频| 亚洲三级国产| 91久久亚洲| 欧美成人综合| 亚洲日产国产精品| 亚洲福利视频一区| 免费91麻豆精品国产自产在线观看| 合欧美一区二区三区| 久久精品国产视频| 亚洲在线视频免费观看| 国产精品毛片a∨一区二区三区| 中文精品视频| 99精品久久久| 国产精品国产三级国产aⅴ浪潮 | 亚洲欧美日韩精品久久奇米色影视 | 久久一区中文字幕| 久久av一区二区三区漫画| 国产中文一区| 老妇喷水一区二区三区| 久久久久久久久伊人| 亚洲国产精品电影在线观看|