P1479 宿舍里的故事之五子棋(搜索)

本文探讨了一个有趣的算法问题:在5*5的棋盘上放置n颗棋子(5<=n<=25),目标是找出所有可能的棋子排列方式中,能够形成五子连珠的不同情况数量之和。通过深度优先搜索策略,文章提供了一段C++代码实现,展示了如何计算这些特定排列的总数。

题目描述

宿舍里好多好多有趣的事!

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值