摘要: 这一题是比较麻烦的深搜加广搜的题,考察范围较广,题目大意是从起点出发分别找出左贴墙走、右贴墙与正常走到终点的最短路程。很自然联想到用广搜解决正常走的最短路径,用深搜解决另两种最短路程。难点是如何解决深搜时的方向问题,由于不会用C++提供的STL中德队列类,所以就自己写的,比较麻烦,不过思路应该还算清晰吧。AC代码如下:#include <iostream>#define MAX 100#define MAXN 10000using namespace std;char map[MAX][MAX];int vis[MAX][MAX];int dir1[4][2]={{0,-1},{1 阅读全文
posted @ 2012-02-24 10:01 背着超人飞 阅读(211) 评论(0) 推荐(0)
摘要: 这一题算是典型的BFS的题,题目大意是要找到一个正整数n的整数倍的数,使它只由0或1组成,找到任意一个即可输出。如果从n开始按倍数枚举再找出有0或1组成的肯定超时,而且程序实现也比较麻烦,于是考虑广搜一下由0或1组成的数,再判断它是否能被n整除。AC代码如下:#include <iostream>using namespace std;__int64 a[2000000];//由于数可能比较大,所以用64位比较保险int main(){ int n; int k = 0; a[0] = 1; while (cin >> n) { if (n == 0) break; i 阅读全文
posted @ 2012-02-24 09:23 背着超人飞 阅读(135) 评论(0) 推荐(0)
摘要: 题目大意是:—乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。看到这道题首先想到的就是暴力法枚举。枚举原始长度dfs判断该长度是否可以由小木棒组合而成。不过直接这样肯定超时,自然想到要添加剪枝;—剪枝策略:—1、已知木棒总长度sum,原始木棒长度L一定满足sum%L = 0;—2、将木棒从大到小排序,因为越长的木棒对后面的约束越大;—3、当一根木棒搜索失败时,跳过与它相同长度的;—4、 阅读全文
posted @ 2012-02-23 23:20 背着超人飞 阅读(205) 评论(0) 推荐(0)
摘要: 1 #include <iostream> 2 #define MAX 10 3 using namespace std; 4 char a[MAX][MAX]; 5 int tot , n, k; 6 bool vis[MAX];//用于记录某一列上是否已摆过棋子 7 void dfs(int cur, int num)//深搜开始 8 { 9 if(num == k)10 {11 tot ++;//得到一种情况12 return;13 }14 if(cur == n)15 return;16 for(... 阅读全文
posted @ 2012-02-23 22:49 背着超人飞 阅读(136) 评论(0) 推荐(0)