A。胜利大逃亡
HDU 1253
很简单的三维BFS,直接贴代码。
#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的细节了,写的有点粗糙,下次改=。=现在脑袋好乱。
#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开始到最近的海边的路程。
思路:数据超小,直接枚举所有的路取最小值=。=
#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
HDU3335
题意:给出一堆数字,问你这里面互质的数字最多是多少(题意描述和这里略有不同,但是我是这么理解的,写起来也不复杂,不用想那么多)。
其实这一题我觉得还是有数论的方法的,但是我一看数据范围=。=,就直接决定枚举了。。然后就过了。
#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);
}
cout<<ans<<endl;
}
}
F。hello world!
hdu3257
找规律,将16进制数转化成2进制,然后1就是#0就是空格,输出即可
#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 change(char a[])
{
int x = (a[0] - '0') * 16 ;
if ( a[1] >= 'A'&& a[ 1] <= 'Z')
x += a[1] - 'A'+10;
else
x += a[1] - '0';
return x;
}
int Map[10][10000];
int main()
{
int T;
cin >> T;
char x[1000];
int cas = 0;
while ( T--)
{
int n ;
cin >> n;
memset(Map,0,sizeof(Map));
int num = 0;
for (int i = 0 ;i < n; i++)
{
num = i*6;
for (int j =0 ; j < 5; j ++ )
{
cin >> x;
int a = change(x);
for (int k = 0 ;k < 7 ; k ++)
{
Map[k][num] = a % 2;
a /= 2;
}
num ++;
}
}
printf("Case %d:\n\n",++cas);
for (int i = 0 ; i < 7 ; i ++)
{
for (int j = 0; j < 6*n-1 ;j++)
{
if(Map[i][j])
cout <<"#";
else cout<<" ";
}
cout <<endl;
}
cout << endl;
}
}