码迷,mamicode.com
首页 > 其他好文 > 详细

2469: 小Y的难题1---SWUST 信息学院OJ

时间:2015-04-29 23:15:49      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:

题目描述:http://www.oj.swust.edu.cn/problem/show/2469

最近小Y迷上了数学,总是在思考各种数学问题。有一天,他不小心把墨水洒在草稿纸上。他现在能看到的是“2?3?1?4”(?表示看不清的地方)。小Y的记忆力不错,他知道:
1、每个?只会是“+”、“-”,“=”三个符号之一。
2、总共有且仅有一个“=”。
3、原式一定是一个等式。如“2+3-1=4”
现在他突然想知道,有多少种可能性,满足上面3个要求。
多组输入。
每组第一行有一个数字n。表示小Y从左到右,一共可以看到n个数字。(2<=n<=15)
每组第二行有n个数字。分别表示这n个数字是什么。保证每个数字都是非负整数,且小于10^7。
对于每组,输出一行,这一行只有一个数字,表示有多少种可能性满足题意。
4
2 3 1 4
4
1 1 1 1
数字之间一定有且仅有一个符号,第一个数字前没有符号。

AC代码:

 1 #include<stdio.h>
 2 
 3 int a[18];
 4 char s[18];
 5 int n;
 6 int flag;
 7 int ans;
 8 
 9 void DFS(int level)//DFS搜索+-=出现的可能性
10 {
11 
12     if(level==n-1)
13     {
14         int i=0,L=a[0],R=0;
15 
16         while(s[i]!==&&i<n-1) {
17 
18             if(s[i]==+) L+=a[i+1];
19             else if(s[i]==-) L-=a[i+1];
20 
21             i++;
22 
23         }
24 
25         while(i<n-1) {
26 
27             if(s[i]==+) R+=a[i+1];
28             else if(s[i]==-) R-=a[i+1];
29             else R=a[i+1];
30 
31             i++;
32         
33         }
34 
35         if(L==R&&flag) ans++;
36 
37         return;
38 
39     }
40 
41     s[level]=+;
42     DFS(level+1);
43 
44     s[level]=-;
45     DFS(level+1);
46 
47     if(flag) return;
48 
49     s[level]==;
50     flag=1;
51     DFS(level+1);
52     flag=0;
53 
54 }
55 
56 int main()
57 {
58     
59     while(scanf("%d",&n)!=EOF)
60     {
61 
62         int i;
63 
64         ans=0;
65 
66         for(i=0;i<n;i++) scanf("%d",&a[i]);
67 
68         DFS(0);
69 
70         printf("%d\n",ans);
71 
72     }
73 
74     return 0;
75 
76 }

 

2469: 小Y的难题1---SWUST 信息学院OJ

标签:

原文地址:http://www.cnblogs.com/yanglingwell/p/4467458.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!