程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 130310周賽

130310周賽

編輯:C++入門知識

A。勝利大逃亡 HDU 1253 很簡單的三維BFS,直接貼代碼。 [cpp]   #include <iostream>   #include <cstdio>   #include <algorithm>   #include <string>   #include <cmath>   #include <cstring>   #include <queue>   #include <set>   #include <vector>   #include <stack>   #include <map>   #include <iomanip>   #define PI acos(-1.0)   #define Max 2000005   #define inf 1<<28   #define LL(x) (x<<1)   #define RR(x) (x<<1|1)   #define ll long long      using namespace std;      struct kdq   {       int x,y,z,step;   };   int movex[6]={0,0,1,-1,0,0};   int movey[6]={0,0,0,0,1,-1};   int movez[6]={1,-1,0,0,0,0};   bool visit[51][51][51];   int mm[100][100][100];   int A,B,C,T;   int inmap(kdq a)   {       if(a.x>=0&&a.x<A&&a.y>=0&&a.y<B&&a.z>=0&&a.z<C)       return 1;       return 0;   }   kdq q[Max];   int  bfs()   {          int num=0,cnt=0;       q[0].x=0,q[0].y=0,q[0].z=0,q[0].step=0;       visit[0][0][0]=1;       num++;       while(num>cnt)       {           kdq temp=q[cnt++];           //cout<<temp.x<<" "<<temp.y<<" "<<temp.z<<endl;           if(temp.x==(A-1)&&temp.y==(B-1)&&temp.z==(C-1))           {              return temp.step;           }           for(int i =0 ;i < 6 ;i ++)           {               kdq next;               next.x=temp.x+movex[i];               next.y=temp.y+movey[i];               next.z=temp.z+movez[i];               //cout<<next.x<<" "<<next.y <<" "<<next.z<<endl;               next.step=temp.step+1;               if(inmap(next)&&!visit[next.x][next.y][next.z]&&!mm[next.x][next.y][next.z])               {                   q[num++]=next;                   visit[next.x][next.y][next.z]=1;               }           }       }       return -1;   }   int main()   {       int t;       cin>>t;       while (t--)       {           scanf("%d%d%d%d",&A,&B,&C,&T);           memset(visit,0,sizeof(visit));           for( int i =0 ;i < A ; i ++)           {               for (int j =0 ;j < B ;j ++)               {                   for (int k = 0; k < C ; k ++)                   {                       scanf("%d",&mm[i][j][k]);                   }               }           }           int ans=bfs();           if(ans<=T)           cout<<ans<<endl;           else           cout<<-1<<endl;       }       return 0;   }   B。prim ring problem  HDU 1016 題目意思很簡單,我的作法就是從1開始dfs找到即輸出,這樣可以保證是按照字典序,然後就是dfs的細節了,寫的有點粗糙,下次改=。=現在腦袋好亂。 [cpp]   #include <iostream>   #include <cstdio>   #include <algorithm>   #include <string>   #include <cmath>   #include <cstring>   #include <queue>   #include <set>   #include <vector>   #include <stack>   #include <map>   #include <iomanip>   #define PI acos(-1.0)   #define Max 2000005   #define inf 1<<28   #define LL(x) (x<<1)   #define RR(x) (x<<1|1)   #define ll long long      using namespace std;      int vis[1000];   bool isvis[1000];   bool flag[1000];   void isprime()//素數表,數據不大,所以100以內就夠了   {       flag[0]=1;       flag[1]=1;       for( int i = 2 ; i < 100 ; i ++)       {           if(!flag[i])           {               for (int j = i*2 ; j < 100 ; j+= i)                   flag[j]=1;           }       }   }      void dfs(int n,int pre,int num)   {       if(n == num&&!flag[1+pre])//找到即輸出 ,這裡輸出有點麻煩,一開始是用vector的 。。但是忘了earse的用法,怒跪,所以下次改。       {           cout<<1;              for(int i=2;i <=n ;i++)           {               for (int j = 2 ;j <=n ; j ++)               {                   if(vis[j]==i)                   {                       cout<<" "<<  j;                       continue;                   }               }           }           cout<<endl;       }       for (int i = 1 ; i <= n ; i++)       {           if(!vis[i])           {               if(!flag[i+pre])               {                   vis[i]=num+1;                   int k=num;                   k++;                   dfs(n,i,k);                   vis[i]=0;                  }           }       }   }      int main()   {       int n ;       isprime();       int cas=1;       while(cin >> n )       {           printf("Case %d:\n",cas++);           vis[1] = 1;           dfs(n,1,1);           cout << endl;       }      }   C。Tetris HDU3647 大模擬。還沒做 D。seaside  HDU 3665 題意:一個人從0開始到最近的海邊的路程。 思路:數據超小,直接枚舉所有的路取最小值=。= [cpp]   #include <iostream>   #include <cstdio>   #include <algorithm>   #include <string>   #include <cmath>   #include <cstring>   #include <queue>   #include <set>   #include <vector>   #include <stack>   #include <map>   #include <iomanip>   #define PI acos(-1.0)   #define Max 2000005   #define inf 1<<28   #define LL(x) (x<<1)   #define RR(x) (x<<1|1)   #define ll long long      using namespace std;      int mm[20][20];   int side[100];   int ans=inf;   int n;   bool vis[100];   void dfs(int now,int num,int ok)//now表示走到哪裡,num表示走的路程 ,ok表示是否到海邊   {       if(ok)       {           ans=min(ans,num);           return ;       }       for (int i = 0 ; i < n ; i ++)       {           if(!vis[i])           {               if(mm[now][i])               {                   vis[i]=1;                   int k =num ;                   k+=mm[now][i];                   if(side[i])                   dfs(i,k,1);                   else                   dfs(i,k,0);                   vis[i]=0;               }           }       }   }   int main()   {       while(cin >> n)       {           memset(mm,0,sizeof(mm));           memset(vis,0,sizeof(vis));           ans=inf;           for (int i = 0 ; i < n ; i ++)           {               int a,b;               cin >> a >> b;               side[i]=b;               while(a--)               {                   int x,y;                   cin >> x>> y;                   mm[i][x]=y;               }           }           vis[0]=1;           dfs(0,0,0);           cout<<ans<<endl;       }   }     E。divisibility 題意:給出一堆數字,問你這裡面互質的數字最多是多少(題意描述和這裡略有不同,但是我是這麼理解的,寫起來也不復雜,不用想那麼多)。 其實這一題我覺得還是有數論的方法的,但是我一看數據范圍=。=,就直接決定枚舉了。。然後就過了。 [cpp]  #include <iostream>   #include <cstdio>   #include <algorithm>   #include <string>   #include <cmath>   #include <cstring>   #include <queue>   #include <set>   #include <vector>   #include <stack>   #include <map>   #include <iomanip>   #define PI acos(-1.0)   #define Max 2000005   #define inf 1<<28   #define LL(x) (x<<1)   #define RR(x) (x<<1|1)   #define ll long long      using namespace std;      ll a[10000];   int main()   {       int T;       cin >>T;       while( T--)       {           int n ;           cin >> n ;           for (int i =0 ; i < n ; i++ )               cin >>a[ i];           sort(a,a+n);           int ans = 1;           vector<int>nn;           for (int k = 0 ; k < n ; k ++)           {               nn.clear();               if(a[k]==1)                   continue;               int minn = a[k];               int num = 1 ;               nn.push_back(minn);//枚舉所有的元素,當然1除外               for (int i = k+1; i < n ; i++)               {                   if(a[i]!=minn&&a[i]!=1)                   {                       bool ok = 0;                       int size=nn.size();                       for(int j = 0 ; j < size; j++)                       {                           if(a[i]%nn[j]==0)                           {                               ok = 1;                               break;                           }                       }                       if(!ok)                       {                           nn.push_back(a[i]);                           num++;                       }                   }               }               ans = max (ans, num);           }  www.2cto.com         cout<<ans<<endl;       }   }   F。hello world! hdu3257 還沒做,比賽時沒做出來=。=因為沒找出規律。。。 然後看了一句話就瞬間懂了=。=,這題考的顯然就是想象力=。= 明天來貼。  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved