1 条题解

  • 0
    @ 2025-8-24 22:57:28

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar we_are_the_chuibing
    z

    搬运于2025-08-24 22:57:28,当前版本为作者最后更新于2024-05-01 14:30:43,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    先 dfs 计算出所有情况(要求先手必须下 1313 颗子,后手必须下 1212 颗子),然后在所有情况上判断是否有人五颗子连着,没有总方案数 +1+1

    理论最坏要跑 12×22512\times 2^{25} 次,但实际上跑得飞快,103ms。

    #include<iostream>
    using namespace std;
    int ans=0,a[26],r=0,t=0;
    void pd(){
    	if(!((a[1]+a[2]+a[3]+a[4]+a[5])%5))return;
    	if(!((a[6]+a[7]+a[8]+a[9]+a[10])%5))return;
    	if(!((a[11]+a[12]+a[13]+a[14]+a[15])%5))return;
    	if(!((a[16]+a[17]+a[18]+a[19]+a[20])%5))return;
    	if(!((a[21]+a[22]+a[23]+a[24]+a[25])%5))return;
    	if(!((a[1]+a[6]+a[11]+a[16]+a[21])%5))return;
    	if(!((a[2]+a[7]+a[12]+a[17]+a[22])%5))return;
    	if(!((a[3]+a[8]+a[13]+a[18]+a[23])%5))return;
    	if(!((a[4]+a[9]+a[14]+a[19]+a[24])%5))return;
    	if(!((a[5]+a[10]+a[15]+a[20]+a[25])%5))return;
    	if(!((a[1]+a[7]+a[13]+a[19]+a[25])%5))return;
    	if(!((a[5]+a[9]+a[13]+a[17]+a[21])%5))return;
    	ans++;
    }
    void dfs(int k){
    	if(k==26){
    		pd();
    	}
    	if(r<=12){
    		a[k]=1;
    		r++;
    		dfs(k+1);
    		r--;
    	}
    	if(t<=11){
    		a[k]=0;
    		t++;
    		dfs(k+1);
    		t--;
    	}
    }
    int main(){
    	dfs(1);
    	cout<<ans;
    	return 0;
    }
    
    • 1

    信息

    ID
    10163
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者