NYOJ 491 dfs() (水)

来源:互联网 发布:java的游戏引擎 编辑:程序博客网 时间:2024/05/12 18:30

额,,纪念一下,,这是这段时间做搜索题做得最快的一次,也是做的最清楚了

题意:

不说了,很清楚,

思路:

深搜
枚举第一行,然后生成下一行,会超时,打个表

代码:(打表)

#include <stdio.h>#include<string.h>#include <iostream>#include <algorithm>using namespace std;int n,m,cn;int vis[29];char str[40],s[40];void chuly(int t)    // 计算数量{    strcpy(s+1,str+1);    int suma,sumb = suma = 0;    while(t)    {        for(int i=1;i<=t;i++)        {            if(s[i]=='+')            suma++;            if(s[i]=='-')            sumb++;        }        for(int i=1;i<t;i++)        if(s[i]==s[i+1])            s[i]='+';        else            s[i]='-';        t--;    }    if(suma==sumb)cn++;}void dfs(int count)   // 深搜枚举{        if(count==n+1)        {            chuly(n);            return;        };            if(!vis[count])            {                 vis[count] = 1;                 str[count] = '+';                 dfs(count+1);                 str[count] = '-';                 dfs(count+1);                 vis[count] = 0;            }}int main(){    //freopen("Output.txt","w",stdout); for(int i=1;i<=19;i++)  {   n = i;      memset(vis,0,sizeof(vis));      cn = 0;      dfs(1);      printf("%d,",cn);  }}

 代码:(表)

#include<stdio.h>int main(){    int ds[20]={0,0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757};    int n;    while(~scanf("%d",&n))    {        printf("%d\n",ds[n]);    }}


 


 

原创粉丝点击