Why so serious? --[NKU]schindlerlee

2010年02月08日星期一.sgu159 && pku2205 dfs

2010年02月08日星期一.sgu159 && pku2205 dfs
/*
 * SOUR:sgu159 && pku2205
 * ALGO:dfs... ...
 * DATE: 2010年 02月 07日 星期日 23:16:59 CST
 * COMM:4 dfs
 * 如果P[n]是符合条件的那么必须有P[n-1]是符合条件的。所以可以从0位开始按位在数的前段
 * 添加数,而在搜索的过程中由于P[n-1]是符合条件的所以只需要判断最高位是否符合条件即可。
 * 不好想啊,我想到了这个符合条件,但是却还是没想到还能这么搜
 * */

本题我的思路就是按位扩展+高精,以下精妙算法完全来自
http://162.105.81.212/JudgeOnline/showmessage?message_id=93126
 1 
 2 const int N = 2048;
 3 int n,bas,top;
 4 int g[N][N];
 5 int a[N];
 6 
 7 void dfs(int idx,int sum)
 8 {
 9   if (idx == n) {
10       if (a[idx-1|| n == 1) {
11           for (int i = 0;i < n;i++) {
12               g[top][i] = a[i];
13           }
14           top++;
15       }
16       return ;
17   }
18   for (int i = 0;i < bas;i++) {
19       a[idx] = i;
20       int tmp = 0;
21       for (int j = 0;j <= idx;j++) {
22           tmp += a[j] * a[idx-j];
23       }
24       if ((sum + tmp) % bas == i) {
25           dfs(idx + 1,(sum + tmp) / bas);
26       }
27   }
28 }
29 
30 int main()
31 {
32   int i,j,k;
33   scanf("%d%d",&bas,&n);
34   dfs(0,0);
35   printf("%d\n",top);
36   for (i = 0;i < top;i++) {
37       for (j = n - 1;j >= 0;j--) {
38           if (g[i][j] >= 10) {
39               printf("%c",g[i][j] - 10 + 'A');
40           }else {
41               printf("%d",g[i][j]);
42           }
43       }
44       printf("\n");
45   }
46   return 0;
47 }
48 


posted on 2010-02-08 00:41 schindlerlee 阅读(910) 评论(0)  编辑 收藏 引用 所属分类: 解题报告


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理