zoukankan      html  css  js  c++  java
  • $P1215 [USACO1.4]母亲的牛奶 Mother's Milk$

    (problem)

    搜索 找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。

    显然 我们需要一个数组来判重 表示这种状态出现过没有。
    然而 储存答案。 需要一个桶?或者sort咯 不过多个cnt 我咧懒得打。
    所以我们用一个(vis[N][N][N] ;) 来判重 表示这种状态出现过没有 出现过就直接返回。
    然后用一个ans数组来储存答案(ans[N] ;) 都是布尔型的就行。
    然后进入程序片段。
    一共三个字母 则倒法有 (6种)
    ({x,y,z}=>{x,y,z})
    倒给自己会收获(RE大礼包)
    所以去除掉给自己的 (2+2+2=6)
    所以可以用循环。
    那就手工模拟好了。不用循环了。

    //中心程序 dfs 写的还算比较详细了。
    inline void dfs(int x,int y,int z) {
    	if(vis[x][y][z]) return ;//判重。
    	if(x == 0) ans[z] = true ;//题目要求。
    	vis[x][y][z] = true ;
    	if(x > 0) {
    		if(y+x >= b) dfs(x-(b-y),b,z) ;
    		if(y+x  < b) dfs(0,y+x,z) ;
    //x->y
    		if(z+x >= c) dfs(x-(c-z),y,c) ;
    		if(z+x  < c) dfs(0,y,z+x) ;
    //x->z
    	}
    	if(y > 0) {
    		if(x+y >= a) dfs(a,y-(a-x),z) ;
    		if(x+y  < a) dfs(x+y,0,z) ;
    //y->x
    		if(z+y >= c) dfs(a,y-(c-z),c) ;
    		if(z+y  < c) dfs(x,0,z+y) ;
    //y->z
    	}
    	if(z > 0) {
    		if(x+z >= a) dfs(a,y,z-(a-x)) ;
    		if(x+z  < a) dfs(x+z,y,0) ;
    //z->x
    		if(y+z >= b) dfs(x,b,z-(b-y)) ;
    		if(y+z  < b) dfs(x,y+z,0) ;
    //z->y
    	}
    }
    

    这个程序没有在意时间复杂度。仅仅是观看过程。

    那么主程序呢

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL ;
    inline LL In() { LL res(0),f(1); register char c = getchar() ; //快读 可省略
    	while(!isdigit(c)) { if(c == '-') f = -1 ; c = getchar() ; }
    	while(isdigit(c)) res = (res << 1) + (res << 3) + (c & 15) , c = getchar() ; return res * f ;
    }
    int a , b , c ;
    const int N = 20 + 5 ;
    bool vis[N][N][N] ;
    bool ans[N] ;
    inline void dfs(int x,int y,int z) {//dfs
    	if(vis[x][y][z]) return ;
    	if(x == 0) ans[z] = true ;
    	vis[x][y][z] = true ;
    	if(x > 0) {
    		if(y+x >= b) dfs(x-(b-y),b,z) ;
    		if(y+x  < b) dfs(0,y+x,z) ;
    		if(z+x >= c) dfs(x-(c-z),y,c) ;
    		if(z+x  < c) dfs(0,y,z+x) ;
    	}
    	if(y > 0) {
    		if(x+y >= a) dfs(a,y-(a-x),z) ;
    		if(x+y  < a) dfs(x+y,0,z) ;
    		if(z+y >= c) dfs(a,y-(c-z),c) ;
    		if(z+y  < c) dfs(x,0,z+y) ;
    	}
    	if(z > 0) {
    		if(x+z >= a) dfs(a,y,z-(a-x)) ;
    		if(x+z  < a) dfs(x+z,y,0) ;
    		if(y+z >= b) dfs(x,b,z-(b-y)) ;
    		if(y+z  < b) dfs(x,y+z,0) ;
    	}
    }
    signed main() {
    	memset(vis,false,sizeof(vis)) , memset(ans,false,sizeof(ans)) ;//初始化
    	a = In() , b = In() , c = In() ;
    	dfs(0,0,c) ;//dfs 
    	for(register int i=0;i<=c;i++) ans[i] ? printf("%d ",i) : 0 ;
    //上面同 if(ans[i]) printf("%d ",i);
    	return 0 ;
    }
    

    (假设不是3个数字)
    那么就比较毒瘤了。
    (看懂这道题的可以再优化)

    不存在十全十美的文章 如同不存在彻头彻尾的绝望
  • 相关阅读:
    yii源码五
    yii源码四
    yii源码三 -- db
    yii源码二 -- interfaces
    yii源码一 -- CComponent
    jquery效果 窗口弹出案例
    JS滚动条
    JS表单验证
    [TCP/IP] TCP流和UDP数据报之间的区别
    [TCP/IP] 关闭连接后为什么客户端最后还要等待2MSL
  • 原文地址:https://www.cnblogs.com/qf-breeze/p/10555564.html
Copyright © 2011-2022 走看看