|
发表于 2016-8-23 17:15:54
|
显示全部楼层
本帖最后由 lx_Zz 于 2016-8-23 17:18 编辑
0.009s 用了点技巧优化了搜索
- #include <stdio.h>
- #include <string.h>
- #include <windows.h>
- int dp[10];
- int stk[10];
- int sp = 1;
- void Print(int num)
- {
- printf("success\n");
- printf("%d", num);
- for (int i = 8; i > 0; i -= 2)
- {
- printf(" %d", stk[i]);
- }
- printf("\n");
- printf(" ");
- for (int i = 7; i > 0; i -= 2)
- {
- printf(" %d", stk[i]);
- }
- printf("\n");
- }
- void dfs(int temp, int step, int num)
- {
- if (step > 3 && (num - 3) == temp)
- {
- Print(num);
- }
- for (int i = 1; i <= 9; i++)
- {
- if (dp[i] == 0 && dp[(i + 3 + temp) % 10] == 0 && (i + 3 + temp) % 10 != 0)
- {
- dp[i] = 1;
- dp[(i + 3 + temp) % 10] = 1;
- stk[sp++] = i;
- stk[sp++] = (i + 3 + temp) % 10;
- int flag = temp;
- if (i + 3 + temp > 10) temp = 1;
- else temp = 0;
- dfs(temp, step + 1, num);
- temp = flag;
- dp[i] = 0;
- dp[(i + 3 + temp) % 10] = 0;
- sp--;
- sp--;
- }
- }
- }
- int main()
- {
- //很明显第一个个数的最高位不是3就是4
- memset(dp, 0, sizeof(dp));
- int num = 3;
- dp[num] = 1;
- dfs(0, 0, num);//先假设首位是3、从低位开始构造
- dp[num] = 0;
- num = 4;
- dp[num] = 1;
- dfs(0, 0, num);//假设首位是4、从低位开始构造
- dp[num] = 0;
- //system("pause");
- return 0;
- }
复制代码
|
|