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

173

被折叠的 条评论
为什么被折叠?



