状态表示
一般为考虑前i行,最后一行状态为s
的集合
分析方法:考虑第i行的状态受到哪些状态的影响(一般仅受到i-1行或i-2行,基于形状分析)
状态划分
当前状态是由所有合法的可以转移到本状态的状态转移而来;基于此进行划分;
对于限制的处理
1.有些方格不能放置:
读入时,不能放置的方格置为1,记录每一行田地状态w[i],在进行状态转移时,state & w[i] == 0,即不能在同一位置为1,否则不合法
2.放置后周围不能继续放置:
一般有十字形,正方形等;考虑相同的位置不能为1、相邻的位置不能为1等;利用 | & 运算
处理方式
一般先处理一个legal数组,表示单看一行,合法的状态(相邻不为1等限制)
bool check(int state)
{
for(int i = 0; i < m; i ++)
if((state >> i & 1) && (state >> i + 1 & 1))
return false;
return true;
}
再处理vector[HTML_REMOVED] state[s]数组,表示能转移到状态s的合法状态集合
for(int i = 0; i < legal.siz
e(); i ++)
for(int j = 0; j < legal.size(); j ++)
{
int a = legal[i], b = legal[j];
if(a & b == 0) state[i].push_back(j)
}
答案的处理
对于前n行的所有结果,可以计算到第n+1行,且第n+1行的状态为0,则此状态即为第n行的所有状态之和