hdu 5077 NAND(打表)2014 Asia regional 鞍山站 H题
生活随笔
收集整理的這篇文章主要介紹了
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; }總結
以上是生活随笔為你收集整理的hdu 5077 NAND(打表)2014 Asia regional 鞍山站 H题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 004-安装CentOS7后需要的操作
- 下一篇: Windows RT复活!Windows