130310周赛(一)

2014-11-24 07:24:54 · 作者: · 浏览: 4
A。胜利大逃亡
HDU 1253
很简单的三维BFS,直接贴代码。
[cpp]
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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=0&&a.y=0&&a.z
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<
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.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<
else
cout<<-1<
}
return 0;
}
B。prim ring problem
HDU 1016
题目意思很简单,我的作法就是从1开始dfs找到即输出,这样可以保证是按照字典序,然后就是dfs的细节了,写的有点粗糙,下次改=。=现在脑袋好乱。
[cpp]
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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<
}
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;