zoukankan      html  css  js  c++  java
  • hdu 5077 NAND(打表)2014 Asia regional 鞍山站 H题

    题目链接:点击打开链接

    题意:就是一个按位运算的一个函数。问最少经过多少步运算能够得到给定数。

    思路:不是我投机取巧想打表。是特么这题仅仅能打表。。

    。打表思想用能够得到的数的集合表示状态bfs;最后有一个须要11步的须要打将近1h。除去这一个十分钟就够了。

    cpp:

    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <vector>
    #include <map>
    using namespace std;
    int mark[300];
    struct node{
    	int deep;
    	vector <int> us;
    	void init(){
    		deep=0;
    		us.push_back(15);
    		us.push_back(51);
    		us.push_back(85);
    		us.push_back(0);
    		us.push_back(255);
    	}
    	bool find(int n){
    		for(int i=0;i<us.size();i++)
    			if(us[i]==n) return 1;
    		return 0;
    	}
    };
    int Nand(int a,int b){
    	return (255^(a&b));
    }
    queue <node> Q;
    map<vector<int>,bool> Map;
    //打出所有表版本号的check
    bool check(){
    	int bj=1;
    	for(int i=0;i<256;i++){
    		if(mark[i]<0) {
    			bj=0;
    		}
    	}
    	if(bj)
    	for(int i=0;i<256;i++){
    		printf("%d , ",mark[i]);
    	}
    	return bj;
    }
    //留下最后一个数不打的check版本号
    bool check(){
    	int cnt=0;
    	for(int i=0;i<256;i++){
    		if(mark[i]<0) {
    			cnt++;
    		}
    	}
    	if(cnt<2)
    	for(int i=0;i<256;i++){
    		printf("%d , ",mark[i]);
    	}
    	return (cnt<2);
    }
    void  bfs(){
    	node tpe;
    	tpe.init();
    	Q.push(tpe);
    	for(int i=0;i<5;i++)
    	{
    		mark[tpe.us[i]]=0;
    	}
    	while (!check()){
    		node tp=Q.front();
    		Q.pop();
    		for(int i=0;i<tp.us.size();i++){
    			for(int j=0;j<tp.us.size();j++){
    				int temp=Nand(tp.us[i],tp.us[j]);
    				if(mark[temp]<0) mark[temp]=tp.deep+1;
    				if(!tp.find(temp)){
    					node he=tp;
    					he.deep++;
    					
    					he.us.push_back(temp);
    					sort(he.us.begin(),he.us.end());
    					if(Map[he.us]==1) continue;
    					Map[he.us]=1; 
    					Q.push(he);
    				}	
    			}
    		}
    	}
    }
    int main(){
    	for(int i=0;i<256;i++) mark[i]=-1;
    	bfs();
    	return 0;
    }


  • 相关阅读:
    linux 和 ubuntu 修改主机名
    Linux删除用户
    ubuntu更新源
    python连接mysql
    用于迭代器的yield return
    Tuple类型
    Action 和 Func
    用iDSDT制作声显卡DSDT
    C#“同步调用”、“异步调用”、“异步回调”
    读懂IL代码就这么简单
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6958042.html
Copyright © 2011-2022 走看看