搜索总结1

搜索总结1
首先需要整理出一个整体思路,第一需要一个标记书本是否发给人的一个标记数组flag[],其次还需要一个二维数组j记录学生喜欢的是哪几本书的二维数组like[i][j],表示的是第i个人喜欢第j本书。

#include<bits/stdc++.h>
using namespace std;
int s,x;
bool flag[50],like[50][50];//like[i][j]表示第i个人喜欢第j本书
void dfs(int i)
{  
    for(int j=1;j<=x;j++)//  
    {
        if(flag[j]&&like[i][j])//如果此书未被选,且第i个人喜欢这本书
        {
            flag[j]=0;//把此书选了
            if(i==x) s++;//dfs的出口是搜索到了第i个人
            else dfs(i+1);//接着去搜索第i+1个人
            flag[j]=1;//回溯
        }
    }
}

int main()
{
    cin>>x;
    int t1,t2;
    for(int i=1;i<=x;i++)
    {
        cin>>t1>>t2;
        like[i][t1]=true;
        like[i][t2]=true;
    }
    memset(flag,true,sizeof(flag));
    dfs(1);
    cout<<s<<endl;
    system("pause");
    return 0;

}

搜索总结1首先要思考搜索的方式,一定要把这些拆分出来的数存入数组中去,因为只有这样才能控制后面一个数一定比前面的数大,然后就是思考这个函数的出口,显而易见,对于这道题来说就是s为0

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int a[10001]={1},n,total;
int search(int ,int);
int print1(int);//函数在前面要预先声明一下,否则会报错 
int search(int s,int t)
{
    for(int i=a[t-1];i<=s&&i!=n;i++)//s这里面传入的是这个自然数,这里面将a[0]设置成1的意义就体现出来了
    //if(i<n)//如果不加这句,那么这个数本身也会作为一个答案输出
    {
        a[t]=i;
        s-=i;
        if(s==0) print1(t);//出口
        else search(s,t+1);
        s+=i;//回溯

    }
}

int print1(int t)
{
    for(int i=1;i<=t-1;i++)
    cout<<a[i]<<"+";
     cout<<a[t]<<endl;
}

int main()
{
    cin>>n;
    search(n,1);
    system("pause");
    return 0;
}
上一篇:基于django的个人博客开发


下一篇:木棍游戏 深度优先搜索