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

NOI2005 智慧珠游戲

Posted on 2011-07-20 23:07 Mato_No1 閱讀(1189) 評論(2)  編輯 收藏 引用 所屬分類: 搜索NOI
【原題見這里
很明顯的精確覆蓋的模型,12個零件,再加上它們經過旋轉、翻轉后的不同形狀,共60種,每種又可以放在不同的位置(只看最左上的那個珠子)一種零件的一種位置就是一行。列(限制)有兩種:每個格子只能放一個(55列),以及每個零件(注意是每個零件,不是每種零件)只能用一次(12列),共67列。預先放的那些零件可以看成預先選中的行。然后DLX精確覆蓋即可。

下面是DLX精確覆蓋的幾個易疵點:
(1)整個矩陣的行數和列數不能疵(比如本題是1644行,67列);
(2)注意init_d()、add_node(int, int)、delcol(int)、resucol(int)中的一些細節:
【1】init_d()中,是否把m寫成了n;
【2】add_node(int, int)中,是否寫了cols[c]++;
【3】delcol(int)和resucol(int)中,變量有木有疵(比如把i寫成j之類的),另外是否對cols進行了處理;
(3)如果有一些行預先被選中,注意在刪掉這些行的時候是否刪光,不要漏了行頭(rowh);
(4)注意區分行號、列號和結點下標,delcol(int x)和resucol(int x)中的參數x一定是列號,而記錄可行解的res數組里存放的一定是行號;
(5)結點的行、列號均從1開始(第0行、第0列有特殊意義);
(6)如果有多組數據,檢查在每組數據之前是否將所有數組初始化;

本題代碼:
#include <iostream>
#include 
<stdio.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define set(i, j, x, y) PX[i][j] = x; PY[i][j] = y;
const int S = 10, n = 1644, m = 67, T = 60, INF = ~0U >> 2;;
const int LL[12= {046141519273139474852}, RR[12= {3513141826303846475159};
const char SSS[T + 1= "AAAABBCCCCCCCCDEEEEFFFFFFFFGGGGHHHHHHHHIIIIIIIIJKKKKLLLLLLLL";
struct dlnode {
    
int r, c, U, D, L, R;
} d[(n 
+ 1* (m + 1)];
int rowh[n + 1], cols[m + 1], nodes, PX[T][5], PY[T][5], len[T], No[S][S], pos[n + 1][3], _pos[T][S][S], res[n], res_len;
char a[S][S];
bool vst[12];
void init_d()
{
    re3(i, 
0, m) {d[i].U = d[i].D = i; d[i].L = i - 1; d[i].R = i + 1;} d[0].L = m; d[m].R = 0; nodes = m;
    re1(i, n) rowh[i] 
= -1;
    re1(i, m) cols[i] 
= 0;
}
void add_node(int r, int c)
{
    cols[c]
++; d[++nodes].r = r; d[nodes].c = c; d[nodes].U = d[c].U; d[nodes].D = c; d[c].U = nodes; d[d[nodes].U].D = nodes;
    
int rh = rowh[r]; if (rh == -1) d[nodes].L = d[nodes].R = rowh[r] = nodes; else {
        d[nodes].L 
= d[rh].L; d[nodes].R = rh; d[rh].L = nodes; d[d[nodes].L].R = nodes;
    }
}
void init()
{
    freopen(
"zhzyx.in""r", stdin);
    
char ch;
    re(i, S) {
        re(j, i
+1) a[i][j] = getchar();
        ch 
= getchar();
    }
    fclose(stdin);
}
void delLR(int x)
{
    d[d[x].L].R 
= d[x].R; d[d[x].R].L = d[x].L;
}
void resuLR(int x)
{
    d[d[x].L].R 
= d[d[x].R].L = x;
}
void delUD(int x)
{
    d[d[x].U].D 
= d[x].D; d[d[x].D].U = d[x].U;
}
void resuUD(int x)
{
    d[d[x].U].D 
= d[d[x].D].U = x;
}
void delcol(int x)
{
    delLR(x); 
for (int i=d[x].D; i != x; i=d[i].D) for (int j=d[i].R; j != i; j=d[j].R) {cols[d[j].c]--; delUD(j);}
}
void resucol(int x)
{
    
for (int i=d[x].U; i != x; i=d[i].U) for (int j=d[i].L; j != i; j=d[j].L) {resuUD(j); cols[d[j].c]++;} resuLR(x);
}
void prepare()
{
    init_d();
    len[
0= 3set(0000); set(0101); set(0210);
    len[
1= 3set(1000); set(1101); set(1211);
    len[
2= 3set(2000); set(2110); set(2211);
    len[
3= 3set(3000); set(3110); set(321-1);
    len[
4= 4set(4000); set(4101); set(4202); set(4303);
    len[
5= 4set(5000); set(5110); set(5220); set(5330);
    len[
6= 4set(6000); set(6101); set(6202); set(6310);
    len[
7= 4set(7000); set(7101); set(7202); set(7312);
    len[
8= 4set(8000); set(8110); set(8211); set(8312);
    len[
9= 4set(9000); set(9110); set(921-1); set(931-2);
    len[
10= 4set(10000); set(10101); set(10210); set(10320);
    len[
11= 4set(11000); set(11101); set(11211); set(11321);
    len[
12= 4set(12000); set(12110); set(12220); set(12321);
    len[
13= 4set(13000); set(13110); set(13220); set(1332-1);
    len[
14= 4set(14000); set(14101); set(14210); set(14311);
    len[
15= 5set(15000); set(15110); set(15220); set(15321); set(15422);
    len[
16= 5set(16000); set(16110); set(16220); set(1632-1); set(1642-2);
    len[
17= 5set(17000); set(17101); set(17202); set(17310); set(17420);
    len[
18= 5set(18000); set(18101); set(18202); set(18312); set(18422);
    len[
19= 5set(19000); set(19101); set(19202); set(19303); set(19411);
    len[
20= 5set(20000); set(20101); set(20202); set(20303); set(20412);
    len[
21= 5set(21000); set(2111-1); set(21210); set(21311); set(21412);
    len[
22= 5set(22000); set(2211-2); set(2221-1); set(22310); set(22411);
    len[
23= 5set(23000); set(23110); set(23211); set(23320); set(23430);
    len[
24= 5set(24000); set(24110); set(2421-1); set(24320); set(24430);
    len[
25= 5set(25000); set(25110); set(25220); set(25321); set(25430);
    len[
26= 5set(26000); set(26110); set(26220); set(2632-1); set(26430);
    len[
27= 5set(27000); set(27101); set(27202); set(27310); set(27412);
    len[
28= 5set(28000); set(28110); set(28211); set(28302); set(28412);
    len[
29= 5set(29000); set(29101); set(29210); set(29320); set(29421);
    len[
30= 5set(30000); set(30101); set(30211); set(30320); set(30421);
    len[
31= 5set(31000); set(31101); set(31202); set(31310); set(31411);
    len[
32= 5set(32000); set(32101); set(32202); set(32311); set(32412);
    len[
33= 5set(33000); set(33101); set(33210); set(33311); set(33412);
    len[
34= 5set(34000); set(34101); set(3421-1); set(34310); set(34411);
    len[
35= 5set(35000); set(35101); set(35210); set(35311); set(35420);
    len[
36= 5set(36000); set(36101); set(36210); set(36311); set(36421);
    len[
37= 5set(37000); set(37110); set(37211); set(37320); set(37421);
    len[
38= 5set(38000); set(3811-1); set(38210); set(3832-1); set(38420);
    len[
39= 5set(39000); set(39101); set(39202); set(39312); set(39413);
    len[
40= 5set(40000); set(40101); set(40202); set(4031-1); set(40410);
    len[
41= 5set(41000); set(41101); set(41211); set(41312); set(41413);
    len[
42= 5set(42000); set(42101); set(4221-2); set(4231-1); set(42410);
    len[
43= 5set(43000); set(43110); set(43220); set(43321); set(43431);
    len[
44= 5set(44000); set(44110); set(4422-1); set(44320); set(4443-1);
    len[
45= 5set(45000); set(45110); set(45211); set(45321); set(45431);
    len[
46= 5set(46000); set(4611-1); set(46210); set(4632-1); set(4643-1);
    len[
47= 5set(47000); set(4711-1); set(47210); set(47311); set(47420);
    len[
48= 5set(48000); set(48110); set(48211); set(48321); set(48422);
    len[
49= 5set(49000); set(4911-1); set(49210); set(4932-2); set(4942-1);
    len[
50= 5set(50000); set(50101); set(50211); set(50312); set(50422);
    len[
51= 5set(51000); set(51101); set(5121-1); set(51310); set(5142-1);
    len[
52= 5set(52000); set(52101); set(52202); set(52303); set(52410);
    len[
53= 5set(53000); set(53101); set(53202); set(53303); set(53413);
    len[
54= 5set(54000); set(5411-3); set(5421-2); set(5431-1); set(54410);
    len[
55= 5set(55000); set(55110); set(55211); set(55312); set(55413);
    len[
56= 5set(56000); set(56101); set(56210); set(56320); set(56430);
    len[
57= 5set(57000); set(57101); set(57211); set(57321); set(57431);
    len[
58= 5set(58000); set(58110); set(58220); set(58330); set(58431);
    len[
59= 5set(59000); set(59110); set(59220); set(5933-1); set(59430);
    
int No0 = 0, x0, y0, z; re(i, S) re(j, i+1) No[i][j] = ++No0;
    
bool ff;
    No0 
= 0; re(i, T) re(x, S) re(y, x+1) {
        ff 
= 1; re(j, len[i]) {
            x0 
= x + PX[i][j]; y0 = y + PY[i][j];
            
if (x0 < 0 || x0 >= S || y0 < 0 || y0 >= S || x0 < y0) {ff = 0break;}
        }
        
if (ff) {
            No0
++; pos[No0][0= i; pos[No0][1= x; pos[No0][2= y; _pos[i][x][y] = No0;
            re(j, len[i]) {x0 
= x + PX[i][j]; y0 = y + PY[i][j]; add_node(No0, No[x0][y0]);} add_node(No0, 55 + SSS[i] - 64);
        }
    }
    re(i, 
12) vst[i] = 0;
    
int _x, rh;
    re(x, S) re(y, x
+1if (a[x][y] != '.') {
        z 
= a[x][y] - 65;
        
if (!vst[z]) {
            vst[z] 
= 1;
            re3(i, LL[z], RR[z]) {
                ff 
= 1; re(j, len[i]) {
                    x0 
= x + PX[i][j]; y0 = y + PY[i][j];
                    
if (x0 < 0 || x0 >= S || y0 < 0 || y0 >= S || x0 < y0 || a[x0][y0] != a[x][y]) {ff = 0break;}
                }
                
if (ff) {
                    _x 
= _pos[i][x][y]; rh = rowh[_x]; delcol(d[rh].c);
                    
for (int j=d[rh].R; j != rh; j=d[j].R) delcol(d[j].c);
                    
break;
                }
            }
        }
    }
}
bool dfs(int dep)
{
    
if (!d[0].R) {res_len = dep; return 1;}
    
int mins = INF, c0; for (int i=d[0].R; i; i=d[i].R) if (!cols[i]) return 0else if (cols[i] < mins) {mins = cols[i]; c0 = i;}
    delcol(c0);
    
for (int i=d[c0].D; i != c0; i=d[i].D) {
        
for (int j=d[i].R; j != i; j=d[j].R) {delcol(d[j].c);}
        res[dep] 
= d[i].r; if (dfs(dep + 1)) return 1;
        
for (int j=d[i].L; j != i; j=d[j].L) resucol(d[j].c);
    }
    resucol(c0);
    
return 0;
}
void solve()
{
    
int x, y, z;
    
if (dfs(0)) {
        re(i, res_len) {
            z 
= pos[res[i]][0]; x = pos[res[i]][1]; y = pos[res[i]][2];
            re(j, len[z]) a[x 
+ PX[z][j]][y + PY[z][j]] = SSS[z];
        }
    } 
else res_len = -1;
}
void pri()
{
    freopen(
"zhzyx.out""w", stdout);
    
if (res_len == -1) puts("No solution"); else re(i, S) {re(j, i+1) putchar(a[i][j]); puts("");}
    fclose(stdout);
}
int main()
{
    init();
    prepare();
    solve();
    pri();
    
return 0;
}

Feedback

# re: NOI2005 智慧珠游戲  回復  更多評論   

2014-09-28 17:01 by
把代碼放在vs2013上跑,一直在prepare里循環...

# re: NOI2005 智慧珠游戲  回復  更多評論   

2015-01-07 18:40 by sluqy671
add_node(No0, 55 + SSS[i] - 64);
請問這句話有什么作用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            老司机凹凸av亚洲导航| 欧美乱在线观看| 免费日韩成人| 久久久中精品2020中文| 性感少妇一区| 久久久久久999| 久久性色av| 亚洲国产毛片完整版 | 在线日韩一区二区| 亚洲大片一区二区三区| 亚洲精品自在久久| 香蕉久久久久久久av网站| 久久久久国产精品www| 欧美v日韩v国产v| 欧美午夜不卡在线观看免费| 久久久九九九九| 欧美aa在线视频| 欧美日韩在线一区二区| 国产欧美日韩伦理| 亚洲国产精品va在线看黑人动漫 | 欧美一区二区三区在线视频| 久久久久久久国产| 亚洲欧洲一区二区天堂久久| 亚洲视频网站在线观看| 久久久噜噜噜久久| 国产精品成人一区二区网站软件| 国产免费一区二区三区香蕉精| 激情欧美一区二区| 亚洲欧美成人网| 亚洲第一页在线| 久久成人综合网| 国产精品高潮在线| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲欧美怡红院| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产一区二区三区久久| 亚洲激情精品| 欧美专区福利在线| 日韩视频永久免费观看| 久久亚洲综合色| 国产亚洲欧洲一区高清在线观看| 一本大道久久a久久综合婷婷 | 永久免费视频成人| 午夜视频在线观看一区二区| 日韩午夜av电影| 欧美成人精品不卡视频在线观看| 国产啪精品视频| 亚洲免费影视| 一本色道久久88综合亚洲精品ⅰ| 免费高清在线视频一区·| 韩国一区二区三区美女美女秀| 亚洲午夜小视频| 日韩视频中文字幕| 欧美日韩国产成人在线| 亚洲三级影片| 欧美激情第五页| 麻豆av一区二区三区久久| 一区二区三区我不卡| 久久久精品欧美丰满| 亚洲欧美日韩爽爽影院| 国产精品日韩精品| 亚洲欧美在线免费| 久久综合色一综合色88| 亚洲欧洲一区二区三区| 女女同性精品视频| 久久亚洲精品中文字幕冲田杏梨 | 亚洲精品九九| 欧美国产精品一区| 久久综合福利| 亚洲精品在线二区| 亚洲国产一区二区在线| 欧美成人免费视频| 亚洲精品视频啊美女在线直播| 亚洲动漫精品| 欧美日韩第一区| 亚洲视频观看| 亚洲图中文字幕| 国产欧美精品一区aⅴ影院| 久久精品综合一区| 久久综合久久综合久久| 亚洲日本欧美| 亚洲专区在线视频| 亚洲自啪免费| 精品1区2区3区4区| 欧美国产丝袜视频| 欧美色图五月天| 久久精品免费观看| 麻豆国产精品一区二区三区 | 两个人的视频www国产精品| 亚洲精品国产精品国自产在线 | 欧美二区在线播放| 欧美日韩蜜桃| 久久久久久久久岛国免费| 美女视频黄 久久| 在线一区二区三区四区| 亚洲欧美一区二区原创| 在线精品一区二区| 亚洲伦理一区| 在线不卡亚洲| 亚洲一区国产视频| 欧美国产另类| 欧美在线视频一区二区| 美女网站在线免费欧美精品| 亚洲女ⅴideoshd黑人| 美女日韩在线中文字幕| 午夜伦理片一区| 欧美成人免费视频| 久久久中精品2020中文| 欧美午夜精品一区| 欧美成人蜜桃| 国产亚洲一区在线播放| 一本久久a久久精品亚洲| 在线精品观看| 久久精品一区二区| 久久av红桃一区二区小说| 欧美日韩国产亚洲一区| 牛牛国产精品| 国产欧美一区二区视频| 亚洲一区二区三区在线视频| 免费久久久一本精品久久区| 国产精品久久久| 亚洲激情网址| 在线不卡免费欧美| 欧美一区二区成人| 性欧美超级视频| 国产精品av免费在线观看| 亚洲黄色尤物视频| 亚洲福利专区| 久久青青草原一区二区| 久久久久久久999精品视频| 国产精品三级视频| 在线一区二区三区四区| 亚洲午夜一二三区视频| 欧美日韩精品综合在线| 亚洲国产精品久久久久婷婷老年 | 久久久久久久久久久久久9999| 欧美三区视频| 亚洲免费精品| 一区二区三区日韩| 欧美激情第3页| 亚洲第一成人在线| 亚洲精品一区在线观看| 欧美猛交免费看| 亚洲激情在线观看视频免费| 亚洲精品视频免费| 欧美日本一区二区高清播放视频| 亚洲国产一区二区a毛片| 一区二区福利| 国产美女扒开尿口久久久| 香蕉久久夜色精品| 毛片基地黄久久久久久天堂| 亚洲激情视频在线播放| 欧美人在线视频| 中文在线资源观看视频网站免费不卡| 亚洲女同同性videoxma| 国产一区观看| 欧美成在线视频| 在线午夜精品| 久久久噜久噜久久综合| 亚洲精品1区| 欧美人与禽性xxxxx杂性| 亚洲图色在线| 免费日韩成人| 亚洲一区二区精品在线观看| 国产视频一区在线观看| 欧美va亚洲va日韩∨a综合色| 亚洲美洲欧洲综合国产一区| 久久精品国产77777蜜臀| 亚洲三级电影全部在线观看高清| 国产精品欧美激情| 久久综合一区二区三区| 亚洲神马久久| 欧美国产日韩一区二区三区| 午夜精品一区二区三区在线| 国产一区二区三区自拍| 欧美精选在线| 久久国产天堂福利天堂| 99精品视频一区| 欧美sm视频| 亚洲欧洲av一区二区| 亚洲日本中文字幕| 国产一区二区三区久久悠悠色av | 日韩视频免费观看| 欧美gay视频| 久久久久久久综合| a91a精品视频在线观看| 欧美77777| 久久国产精品久久久久久电车| 亚洲激精日韩激精欧美精品| 国产欧美va欧美不卡在线| 欧美精品一区二区三| 久久久久久久一区二区三区| 亚洲午夜一区二区| 亚洲精品美女| 欧美激情一区二区三区蜜桃视频| 欧美一区二区三区免费看| 亚洲午夜免费视频| 亚洲精选久久| 亚洲国产日韩欧美| 精品99一区二区三区|