暴力dfs POJ1426

/*

           题目地址:http://poj.org/problem?id=1426点击打开链接

        题目大意:找出仅用0和1 组成的十进制的数构成是出入n的倍数(n<=200)

        解题思路:有人直接打表打了200个,因为并不像想的那样数据那么大,有的直接用数学原理。

                            当然我用了dfs深搜从第一位1开始往下搜,而且是暴力搜索。。。

*/

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int p,pos;
char res[102];

int dfs(int step,int a)
{
	if(step>100)
		return 0;        //return 0,则回溯,继续。       
	
    if(a%p==0&&step>=0&&step<=100)
	{
	     res[++pos]='\0';            
		 return 1;
	}
	  else
	  {
		  pos++;
		  res[pos]='0';
		  if(dfs(step+1,(a*10+0)%p)) 
			  return 1;     //return 1,则结束。
		  pos--;
		  pos++;           //pos++,--来控制res数组保存的值。
		  res[pos]='1'; 
		  if(dfs(step+1,(a*10+1)%p))  
			  return 1;
		  pos--;
		  return 0;        //必须回溯
	  }
}
   
int main()
{
   while(cin>>p&&p)
   {
	   pos=-1;
	   res[++pos]='1'; 
       dfs(1,1);
	   cout<<res<<endl;
   }
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值