当前位置:编程学习 > C/C++ >>

130310周赛

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)  
&nb
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,