poj1950(dfs)

http://poj.org/problem?id=1950

题意:给你一个数N,求1~n中通过+-.运算得为0得方案有多少,并输出前20种。.的意思是合并

思路:没剪纸,需要注意的是两两位数合并要*100,不是*10.还有就是最多要输出20种,不然会OLE。。。。。。,另外本身是打算做1905的。。。。

#include <iostream>
#include <cstdio>

using namespace std;

char ch[100];
int n,sum;

int getNumLen(int i){
	int k = i;
	while(ch[i] == '.' && i < n) i++;
	return i-k+1;
}

void isRight(){
	int i = 1;
	int ans = 1;
	while(i < n){
		if (ch[i] == '.'){
			while(ch[i] == '.' && i < n){
				i++;
				ans*=10;
				if (i > 9) ans*= 10;
				ans+=i;
			}
			continue;
		}
		if (ch[i] == '+'){
			i++;
			int p = i;
			while(ch[i] == '.' && i < n){
				i++;
				p*=10;
				if (i > 9) p*= 10;
				p+=i;
			}
			ans += p;
			continue;
		}

		if (ch[i] == '-'){
			i++;
			int p = i;
			while(ch[i] == '.' && i < n){
				i++;
				p*=10;
				if (i > 9) p*= 10;
				p+=i;
			}
			ans -= p;
			continue;
		}
		
	}
	if (ans == 0) {
		if (sum < 20){
		for (int i = 1; i < n; i++)
			cout << i << " " << ch[i] << " ";
		cout << n << endl;
	}
		sum++;
	}
}

void dfs(int x){
	if (x == n) {
		isRight();
		return ;
	}

	ch[x] = '+';
	dfs(x+1);
	ch[x] = '-';
	dfs(x+1);
	ch[x] = '.';
	dfs(x+1);
}

int main(){
	scanf("%d", &n);
	sum = 0;
	dfs(1);
	printf("%d\n", sum);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值