万万没想到能拿到省一,以为第一次能拿个省二就不错了,有些意外。。。
那么就从此题再次开启我的蓝桥杯刷题之旅把!!!
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int q[18][18];
int vis[18];
int ans=0;
bool get_sum(int i) ///求第i行的和
{
int sum=0;
for(int j=0; j<4; j++)
{
sum+=q[i][j];
}
if(sum!=34) return 0;
return 1;
}
bool check()
{
int sum=0;
sum=q[1][1]+q[2][2]+q[3][3]+q[0][0]; ///对角线1
if(sum!=34) return 0;
sum=q[0][3]+q[1][2]+q[2][1]+q[3][0];///对角线2
if(sum!=34) return 0;
for(int i=0; i<4; i++) /// 行
{
if(get_sum(i)==0)
{
return 0;
}
}
for(int j=0; j<4; j++) ///列
{
sum=q[1][j]+q[2][j]+q[3][j]+q[0][j];
if(sum!=34) return 0;
}
return 1;
}
void dfs(int step)
{
if(step==16)
{
if(check())
{
ans++;
}
return ;
}
if(step%4==0)
{
if(get_sum(step/4-1)==0)
{
return ;
}
}
for(int i=2; i<=16; i++)
{
if(vis[i]==0)
{
vis[i]=1;
int x=step/4;
int y=step%4;
q[x][y]=i;
dfs(step+1);
vis[i]=0;
}
}
}
int main()
{
memset(vis,0,sizeof(vis));
q[0][0]=1;
dfs(1);
printf("%d\n",ans);
//printf("416\n");
return 0;
}