dfs,排序
剪枝:这个题和前面有一道寒假作业的差不多,对每一行进行判断一下是否符合条件
#include<iostream> #include<cstring> using namespace std ; int cnt ; int m[5][5] ; bool v[20] ; bool check(){ bool flag = 1 ; for(int i = 0 ; i < 4 ; i ++){ if(m[i][0]+m[i][1]+m[i][2]+m[i][3] != 34) flag = 0; if(m[0][i]+m[1][i]+m[2][i]+m[3][i] != 34) flag = 0 ; } if(m[0][0]+m[1][1]+m[2][2]+m[3][3] != 34) flag = 0 ; if(m[3][0]+m[2][1]+m[1][2] +m[0][3] != 34) flag = 0 ; return flag ; } void dfs(int u){ if(u==16){ if(check()) cnt ++ ; return ; } //每一次填满新的一行,都检查一下这一行有没有满足条件,如果不满足就返回 if(u%4 == 0)if(m[u/4-1][0]+m[u/4-1][1]+m[u/4-1][2]+m[u/4-1][3] != 34) return ; for(int i = 2 ; i <= 16 ; i ++){ if(!v[i]){ m[u/4][u%4] = i; v[i] = 1 ; dfs(u+1) ; v[i] = 0; } } } int main(){ m[0][0] = 1 ; dfs(1); cout << cnt << endl ; return 0; }