您的位置:首页 > 其它

POJ-3187-Backward Digit Sums

2014-04-12 10:50 337 查看
题目链接:http://poj.org/problem?id=3187

这是一个简单的深度优先搜索搜索入门题,因为自己算法一直没怎么重视,现在又开始重新刷这道题的时候,出现了好多次小错误,耽误了很多时间。

教训:一定要注意不要随意设全局变量,以免在某些函数中改了值之后对其他函数造成影响

下面贴代码:

#include<iostream>
#include<cstring>
int a[11],vis[11],n,k=0,sum;
using namespace std;
int check()
{
int i,k;
int d[11];
int z[11];
k=n;
for(i=0;i<k;i++)
{
z[i]=d[i]=a[i];//对全局变量a[]数组进行拷贝,而不是直接对a[]数组进行操作
}
while(k>1)
{
for(i=0;i<k;i++)
{
d[i]=z[i]+z[i+1];
}
k--;
for(i=0;i<k;i++)
z[i]=d[i];
}
if(d[0]==sum)return true;
else return false;
}

int dfs(int x)
{
int i;
if(x==n&&check())return true;//x取值已经越界,此时判断得到的排列是否满足条件
for(i=1;i<=n;i++)
{
if(x<n&&!vis[i])
{
vis[i]=1;
a[x]=i;
if(dfs(x+1))return true;
vis[i]=0;
}
}
return false;
}
int main()
{
int i;
while(cin>>n>>sum)
{
memset(vis,0,sizeof(vis));
if(dfs(0))
for(i=0;i<n;i++)
{
if(i>0)cout<<" ";
cout<<a[i];
}
cout<<endl;

}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: