poj1950(dfs)

来源:互联网 发布:手机性能测评软件 编辑:程序博客网 时间:2024/04/29 21:39

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);}


0 0
原创粉丝点击