http://poj.org/problem?id=1950
赤裸裸的深度优先搜索,只是在考虑“.”时的处理要麻烦一些,要小心处理啊,不然错的很严重。
//dfs
#include <stdio.h>
#include <string.h>
int n;
char str[21][16];
char strtmp[16];
int num, numtmp;
int res;
void dfs(int cur, int next)
{
if(cur > n)return;
if(cur == n&&res == 0){
if(num < 20){
strcpy(str[num], strtmp);
num ++;
}
else num ++;
return;
}
//+
res += next;
strtmp[numtmp] = '+';
numtmp ++;
dfs(cur+1, next+1);
numtmp --;
res -= next;
//-
res -= next;
strtmp[numtmp] = '-';
numtmp ++;
dfs(cur+1, next+1);
numtmp --;
res += next;
//.
if(numtmp>0){
int tmp;
int j, k = 1;
int tp = cur, tm;
if(next >= 10)tmp = 100*cur + next;
else tmp = 10*cur + next;
if(strtmp[numtmp-1] == '+')res = res - cur + tmp;
else if(strtmp[numtmp-1] == '-')res = res + cur - tmp;
else {
for(j = numtmp-1; j >=0; j --){
if(strtmp[j] != '.'){
break;
}
tp --;
}
// printf("tp = %d\n", tp);
tm = tp;
tp ++;
for(k = j+1; k < numtmp; k ++){
if(tp >= 10){
tm = 100*tm + tp;
}
else tm = 10*tm + tp;
tp ++;
}
if(next >= 10)tmp = 100*tm + next;
else tmp = 10*tm + next;
if(j == -1) res = tmp;
else if(strtmp[j] == '+')res = res - tm + tmp;
else if(strtmp[j] == '-')res = res + tm - tmp;
}
strtmp[numtmp] = '.';
numtmp ++;
dfs(cur+1, next+1);
numtmp --;
if(strtmp[numtmp-1] == '-')res = res + tmp - cur;
else if(strtmp[numtmp-1] == '+')res = res - tmp + cur;
else {
if(j == -1)res = tm;
else if(strtmp[j] == '-')res = res + tmp - tm;
else if(strtmp[j] == '+')res = res - tmp + tm;
}
}
else {
int tmp;
tmp = 10*1 + next;
res = tmp;
strtmp[numtmp] = '.';
numtmp ++;
dfs(cur+1, next+1);
// numtmp --;
}
}
int main()
{
int i, j;
while(scanf("%d", &n)!=EOF){
num = 0;
numtmp = 0;
res = 1;
dfs(1, 2);
if(num >= 20){
for(j = 0; j < 20; j ++){
for(i = 0; i < n - 1; i ++){
printf("%d %c ", i+1, str[j][i]);
}
printf("%d\n", i+1);
}
}
else {
for(j = 0; j < num; j ++){
for(i = 0; i < n - 1; i ++){
printf("%d %c ", i+1, str[j][i]);
}
printf("%d\n", i+1);
}
}
printf("%d\n", num);
}
return 0;
}