题目描述
宿舍里好多好多有趣的事!
7890653今天看到不知何时流行的五子棋,在宿舍里拿个本子,画一些格子,一个棋盘就做好了!
当7890653把目光放到棋上,突发奇想,呵呵!一个题目就出来了!
在一个 5*5 的棋盘内,放上n颗棋子,其中(5<=n<=25);
这n颗棋子可以不同的放到任何一个地方---在棋盘内!于是呼,便会有五颗棋子排成一行,
或一列,或两条对角线,不同的放法,就会出现多少排五子的排列!
本题你要做的是,给你一个n,你找出不同放法出现的排列(设为k),如:
n=11; 有(1是棋子,0是空格)
1 1 1 0 0 1 1 1 1 1
1 1 0 0 0 1 1 1 1 0
1 1 0 0 0 1 1 0 0 0
1 1 0 0 0 0 0 0 0 0
1 1 0 0 0 k=2; 0 0 0 0 0 k=1;
只有这两种k值,(注意k不重复),你要输出的便是k值的和。
也就是1+2=3!!!!!!
输入输出格式
输入格式:
输入一个数n, 占一行!
其中(5<=n<=25);
输出格式:
输出一个k值的总和!(想也不用想k的范围是1<=k<=12的);
输入输出样例
输入样例#1: 复制
11
输出样例#1: 复制
3
#include <iostream>
using namespace std;
int a[26][26];
int v[13];
int n;
void dfs(int x,int sum)
{
if(sum==0)
{
int k=0;
for(int i=1;i<=5;i++)
{
if(!a[i][i])
break;
if(i==5)
k++;
}
for(int i=1;i<=5;i++)
{
if(!a[i][6-i])
break;
if(i==5)
k++;
}
for(int i=1;i<=5;i++)
{
for(int j=1;j<=5;j++)
{
if(!a[i][j])
break;
if(j==5)
k++;
}
for(int j=1;j<=5;j++)
{
if(!a[j][i])
break;
if(j==5)
k++;
}
}
v[k]=1;
return ;
}
for(int i=x;i<=25;i++)
{
int fx=(i-1)/5+1;
int fy=(i-1)%5+1;
a[fx][fy]=1;
dfs(i+1,sum-1);
a[fx][fy]=0;
}
}
int main()
{
cin>>n;
dfs(1,n);
int ans=0;
for(int i=1;i<=12;i++)
{
if(v[i])
ans+=i;
}
cout<<ans<<endl;
return 0;
}