摘要: 用DFS写当然很简单了,8!的复杂度,16MS搞定。 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀。 状态转移分两种,当前行不加棋子,和加棋子。dp[i][j]中,i代表行数,j代表当前行棋子的状态。j的二进制中,1代表有旗子,0代表无棋子。 贴代码~状压DP果然快一点。#include #include int n,k,count;bool mp[10][10];int num[256];int dp[9][256];int main(){// freopen("in.txt","r",stdin); for(int i= 阅读全文
posted @ 2013-08-01 21:20 SF-_- 阅读(1906) 评论(0) 推荐(0) 编辑
摘要: 最短用BFS即可。关于左手走和右手走也很容易理解,走的顺序是左上右下。 值得注意的是,从起点到终点的右手走法和从终点到起点的左手走法步数是一样。 所以写一个左手走法就好了。贴代码,0MS#include #include #include using namespace std;int mp[45][45];const int DIR[4][2]={ {0,-1},{-1,0},{0,1},{1,0} };bool flag;void DFS(int x,int y,int dir,int step){ if(mp[x][y]) { flag=true; ... 阅读全文
posted @ 2013-08-01 19:33 SF-_- 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 第一次接触欧拉回路。虽然在离散数学里学过,敲代码还是第一次。 本题是说端点颜色相同的两根木棒可连接,能否将所有的木棒连成一条直线。 将颜色视为节点v,将木棒视为边e,构成图G。如果能找到一条一笔画的路经过所有边,那么便符合条件。也就是判断是否是欧拉回路。 欧拉回路的条件是: (1) 图是连通的。 (2) 度数为基数的点的个数是两个,或者不存在。 连通可以通过用并查集判断。度数可以建一个数组保存当前点的度数。 值得注意的是有全空的数据,此时应该输出Possible。这点坑了我一下,在Discuss里发现有人提出了,改一下就A了。#include #include const i... 阅读全文
posted @ 2013-08-01 15:30 SF-_- 阅读(212) 评论(0) 推荐(0) 编辑
摘要: a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0,xi∈[-50,50],且xi!=0。让我们求所有解的可能。 首先,如果暴力判断的话,每个x的取值有100种可能,100^5肯定会超时。 我们可以枚举x1,x2的值,并且记录下来。再枚举x3,x4,x5的值。如果发现有互为相反数的,说明有一个解存在。复杂度却大大降低了。 当然,我们可以只处理正数的情况。如果存在一组解,x1,x2,x3,x4,x5,那么容易证明-x1,-x2,-x3,-x4,-x5也是一组解。 我们只记录a1x13+ a2x23>0的情况,如果发现有相等的a3x33+ a4x43+ a5x53,解.. 阅读全文
posted @ 2013-08-01 13:48 SF-_- 阅读(334) 评论(0) 推荐(0) 编辑
摘要: 经典好题。 题意是要我们找出所有的正方形。1000点,只有枚举咯。 如图,如果我们知道了正方形A,B的坐标,便可以推测出C,D两点的坐标。反之,遍历所有点作为A,B点,看C,D点是否存在。存在的话正方形数+1。 假设A点坐标为(x1,y1),B点坐标为(x2,y2),则根据三角形全等,易知 C点坐标:( x1+(y2-y1),y1-(x2-x1) ) D点坐标:( x2+(y2-y1),y2-(x2-x1) ) 当然,如果我们遍历任意两个点,一个正方形将会被计数四次(四条边)。我们可以只判断斜率>=0的边,这条边在正方形的上方(如图AB边),这样不用重复验证四次了。 过程搞清... 阅读全文
posted @ 2013-08-01 01:21 SF-_- 阅读(390) 评论(0) 推荐(0) 编辑