深度优先搜索,以T581492 四阶数独为例
这里讨论的是一种简化后的数独-四阶数独。给出一个 4×4 的格子,每个格子只能填写 1 到 4 之间的整数,要求每行每列和四等分更小的正方形部分刚好都由1到4组成,每行每列,每小块不能有重复的数字出现,共有多少种方案?
先上代码:
if(x > 16)
ans ++;
int r=(x-1)/4+1;//填入数字所在的行
int c=(x-1)%4+1;//填入数字所在的列
int b=(r-1)/2*2+(c-1)/2+1;//填入数字所在的小方块
for(int i = 1;i <= 4;i++){
if(row[r][i] == 0 && col[c][i] == 0 && block[b][i] == 0){
row[r][i] = col[c][i] = block[b][i] = 1;
a[i] = x;
dfs(x + 1);
·
}
}
} ```
大概思路就是沿着一个答案一直往下填写下去,
如果后续可行,那么就通过`if(x > 16)`作为一个搜索出口避免执行`row[r][i] = col[c][i] = block[b][i] = 0;`;
如果不行那么又会归零并向上一步反馈(回溯),可以通过树状图理解:
(1,1)= 1 ——> (1,2) = 2 ——>……——>(4,4) = 4|——>(此时x > 16,方案数加一)
(4,4) = 4|——>(回溯)
|

浙公网安备 33010602011771号