DLX 精确覆盖
DLX 精确覆盖
对于n * m的可解矩阵(我也不知道该如何描述), 行(n)存的是解空间,列(m)存的是状态空间
hust1017 Exact Cover
此题纯粹是DLX模板题.
zoj 3209 Treasure Map
n = P(图形的个数)
m = N * M(小格子的个数);
spoj1771 N皇后问题
对于N * N的矩阵, 总共有N * N个位子让你来放皇后,所以n = N * N,
而对于每个皇后能攻击四个方向,行、列、右斜、左斜。
所以, m = N + N + ( 2 * N - 1 ) + (2*N - 1 )
for (i = 1 ; i <= N; ++ i) {
for (j = 1 ; j <= N; ++ j) {
k = (i - 1 ) * N + j;
link(k, i);
link(k, N + j);
link(k, 2 * N + i + j - 1 );
link(k, 5 * N + i - j - 1 );
}
}
如果某些皇后已经放置, 就要删除此皇后能攻击到的行、列、右斜、左斜。
poj 3074 , 3076 sudoku 都是数独,一个是9 * 9的数独,一个是16 * 16的数独
将定要求的是一个N * N的数独,总格有N * N个格子, 而每个格子都可以填N个数,
所有n = N * N * N
对于数独每列、每行、每宫的数都必须不同,且还要判断这个格子是否要被填满
所有m = N * N + N * N + N * N + N * N;
第一个N * N表示格子是否要被填满
第二个N * N表示要填的数在第几行
第三个N * N表示要填的数在第几列
第四个N * N表示要填的数在第几宫
这四个状态就可以确定数独了
for (i = 0 ; i < N; ++ i) {
for (j = 0 ; j < N; ++ j) {
char ch = str[ i ][ j ];
int val = i * N + j;
int row, col;
if (ch == ' - ' ) {
for (k = 1 ; k <= N; ++ k) {
row = val * N + k;
col = val + 1 ; add(row, col);
col = N * N + i * N + k; add(row, col);
col = N * N + N * N + j * N + k; add(row, col);
col = N * N + N * N + N * N + palace(i, j) * N + k;
add(row, col);
}
}
else {
k = ch - ' A ' + 1 ;
row = val * N + k;
col = val + 1 ; add(row, col);
col = N * N + i * N + k; add(row, col);
col = N * N + N * N + j * N + k; add(row, col);
col = N * N + N * N + N * N + palace(i, j) * N + k;
add(row, col);
}
}
}
hdu 3663 power station
对于一个电站只可供应它自己所在的城市和相邻的城市且每个城市一天只能被1个电站供应。
因为求的是每个城市供应的时间段.
由于D <= 5 , 所以只有16个区间段
[ 0 , 0 ],[ 1 , 1 ],[ 2 , 2 ],[ 3 , 3 ],
[ 4 , 4 ],[ 5 , 5 ],[ 1 , 2 ],[ 2 , 3 ],
[ 3 , 4 ],[ 4 , 5 ],[ 1 , 3 ],[ 2 , 4 ],
[ 3 , 5 ],[ 1 , 4 ],[ 2 , 5 ],[ 1 , 5 ]
所有n = N * 16 ;
对于 m = N * D + N;
N * D表示第i天供应第j个城市,
由于每个电站只能运行一次,
所以N表示这是第几个发电站供应的。
如果可以无限次发电的话 m = N * D;(应该是这个样的吧)
hdu 2828 lamp
对于M个开关, N个灯泡,选择其中几个开关在某种状态下使N个灯泡都亮。
应为任意开关都有四种可能: (开关选或不选,开关ON或OFF)两两组合就4种
所以 n = N * 4 ;
开关控制的灯泡,此开关是哪个开关
所以 m = N + M;
以上原创且纯粹给自己准备的.
对于n * m的可解矩阵(我也不知道该如何描述), 行(n)存的是解空间,列(m)存的是状态空间
hust1017 Exact Cover
此题纯粹是DLX模板题.
zoj 3209 Treasure Map
n = P(图形的个数)
m = N * M(小格子的个数);
spoj1771 N皇后问题
对于N * N的矩阵, 总共有N * N个位子让你来放皇后,所以n = N * N,
而对于每个皇后能攻击四个方向,行、列、右斜、左斜。
所以, m = N + N + ( 2 * N - 1 ) + (2*N - 1 )
for (i = 1 ; i <= N; ++ i) {
for (j = 1 ; j <= N; ++ j) {
k = (i - 1 ) * N + j;
link(k, i);
link(k, N + j);
link(k, 2 * N + i + j - 1 );
link(k, 5 * N + i - j - 1 );
}
}
如果某些皇后已经放置, 就要删除此皇后能攻击到的行、列、右斜、左斜。
poj 3074 , 3076 sudoku 都是数独,一个是9 * 9的数独,一个是16 * 16的数独
将定要求的是一个N * N的数独,总格有N * N个格子, 而每个格子都可以填N个数,
所有n = N * N * N
对于数独每列、每行、每宫的数都必须不同,且还要判断这个格子是否要被填满
所有m = N * N + N * N + N * N + N * N;
第一个N * N表示格子是否要被填满
第二个N * N表示要填的数在第几行
第三个N * N表示要填的数在第几列
第四个N * N表示要填的数在第几宫
这四个状态就可以确定数独了
for (i = 0 ; i < N; ++ i) {
for (j = 0 ; j < N; ++ j) {
char ch = str[ i ][ j ];
int val = i * N + j;
int row, col;
if (ch == ' - ' ) {
for (k = 1 ; k <= N; ++ k) {
row = val * N + k;
col = val + 1 ; add(row, col);
col = N * N + i * N + k; add(row, col);
col = N * N + N * N + j * N + k; add(row, col);
col = N * N + N * N + N * N + palace(i, j) * N + k;
add(row, col);
}
}
else {
k = ch - ' A ' + 1 ;
row = val * N + k;
col = val + 1 ; add(row, col);
col = N * N + i * N + k; add(row, col);
col = N * N + N * N + j * N + k; add(row, col);
col = N * N + N * N + N * N + palace(i, j) * N + k;
add(row, col);
}
}
}
hdu 3663 power station
对于一个电站只可供应它自己所在的城市和相邻的城市且每个城市一天只能被1个电站供应。
因为求的是每个城市供应的时间段.
由于D <= 5 , 所以只有16个区间段
[ 0 , 0 ],[ 1 , 1 ],[ 2 , 2 ],[ 3 , 3 ],
[ 4 , 4 ],[ 5 , 5 ],[ 1 , 2 ],[ 2 , 3 ],
[ 3 , 4 ],[ 4 , 5 ],[ 1 , 3 ],[ 2 , 4 ],
[ 3 , 5 ],[ 1 , 4 ],[ 2 , 5 ],[ 1 , 5 ]
所有n = N * 16 ;
对于 m = N * D + N;
N * D表示第i天供应第j个城市,
由于每个电站只能运行一次,
所以N表示这是第几个发电站供应的。
如果可以无限次发电的话 m = N * D;(应该是这个样的吧)
hdu 2828 lamp
对于M个开关, N个灯泡,选择其中几个开关在某种状态下使N个灯泡都亮。
应为任意开关都有四种可能: (开关选或不选,开关ON或OFF)两两组合就4种
所以 n = N * 4 ;
开关控制的灯泡,此开关是哪个开关
所以 m = N + M;
以上原创且纯粹给自己准备的.