搜索专题
1.hdu 1664 Different Digits
2.hdu 3533 Escape
题意:有n*m的矩阵,有k个城堡攻打一个间谍A。A从(0,0)-->(n,m);
A,可以向四周前进,花费1秒,可能在原地停留1秒。不能停留1秒以上。
k个城堡的攻击方向是固定的,而且攻击的子弹有速度v 和周期 T
给你一个时间t,问A能否顺利到达。
思路:如何处理A的前进过程中,能否被子弹打中???如何处理停留1秒的过程??
预处理这些城堡,在规定时间内能到达的范围。hash[101][101][1001];
这样只要在(x,y,t)判断是否会被子弹打到就可以处理了。这也是这道题最重要的地方吧
接下去的bfs()处理停留1秒,可以这样处理。
现在4个方向上判断前进1秒时,是否会种弹,会,时间+1,再判断,会,放弃,不会压进
队列。由于时间上的延迟,导致队列里队首的元素可能时间不是最少的,所以要用优先队列。
1 //先填个空 2 #include<iostream> 3 #include<stdio.h> 4 #include<cstring> 5 #include<cstdlib> 6 #include<queue> 7 using namespace std; 8 int n,m,step; 9 bool hash[102][102][1002]; 10 int to[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; 11 char direction[5]={'E','N','W','S'}; 12 int main(){ 13 int k,t,v,x,y,dx,dy,i,hxl,j; 14 char c[5]; 15 while(scanf("%d%d%d%d",&n,&m,&k,&step)>0) 16 { 17 memset(hash,false,sizeof(hash)); 18 for(i=1;i<=k;i++) 19 { 20 scanf("%s%d%d%d%d",c,&t,&v,&x,&y); 21 for(j=0;j<4;j++) 22 if(c[0]==direction[j]) hxl=j; 23 } 24 } 25 return 0; 26 }
3.hdu 1685 Booksort
4.hdu 3309 Roll The Cube
题意:在n*m的矩阵(n,m<=22) 两个球B,打进两个洞H里。如果球进洞了,就会变成 ' . ',草地。
球的运动方向,4个方向。两个球不能重叠,而且,如果球的四周是墙,那么下一个位置还在原地。
两个球是同时控制的。
思路:这个问题,还是比较有意思的。关键是如何保存状态。
1种思路是,保存整个图。把一个图当成一个状态,每次枚举两个或者一个(当一个已经进洞)的情况。
2另一种似乎会更好一些。对于每一个状态,保存是否有一个球已经进洞,保存洞的坐标,如果球已经进洞,不妨
将其设为一个固定值进行特判。
5.hdu 3839 Ancient Messages
6.hdu 2259 Continuous Same Game (2)
7.hdu 2437 Jerboas
8.hdu 3681 Prison Break
9.hdu 2614 Beat
10.hdu 2128 Tempter of the Bone II
11.hdu 2234 无题I
题意:中文的,看链接。
思路:IDA*。
1 #include<iostream> 2 #include<stdio.h> 3 #include<cstring> 4 #include<cstdlib> 5 #include<queue> 6 using namespace std; 7 8 int a[5][5]; 9 int maxdeep; 10 11 bool judge(){ 12 int i,j; 13 bool flag=true; 14 for(i=1;i<=4;i++) 15 for(j=1;j<=3;j++) 16 if(a[i][j]!=a[i][j+1]){ flag=false;break;} 17 if(flag==true) return true; 18 19 flag=true; 20 for(j=1;j<=4;j++) 21 for(i=1;i<=3;i++) 22 if(a[i][j]!=a[i+1][j]) {flag=false;break;} 23 return flag; 24 } 25 int max(int x,int y) 26 { 27 return x>y? x:y; 28 } 29 int get_h() 30 { 31 int i,j,step1=0,step2=0; 32 for(i=1;i<=4;i++) 33 { 34 int num[5]={0},t=0; 35 for(j=1;j<=4;j++) num[a[i][j]]++; 36 for(j=1;j<=4;j++) t=max(t,num[j]); 37 step1=max(step1,4-t); 38 } 39 for(j=1;j<=4;j++) 40 { 41 int num[5]={0},t=0; 42 for(i=1;i<=4;i++) num[a[i][j]]++; 43 for(i=1;i<=4;i++) t=max(t,num[i]); 44 step2=max(step2,4-t); 45 } 46 return step1>step2? step2:step1; 47 } 48 void Down(int j){ 49 int i,tmp=a[4][j]; 50 for(i=3;i>=1;i--) 51 a[i+1][j]=a[i][j]; 52 a[1][j]=tmp; 53 } 54 void Up(int j){ 55 int i,tmp=a[1][j]; 56 for(i=2;i<=4;i++) 57 a[i-1][j]=a[i][j]; 58 a[4][j]=tmp; 59 } 60 void Left(int i){ 61 int j,tmp=a[i][1]; 62 for(j=2;j<=4;j++) 63 a[i][j-1]=a[i][j]; 64 a[i][4]=tmp; 65 } 66 void Right(int i){ 67 int j,tmp=a[i][4]; 68 for(j=3;j>=1;j--) 69 a[i][j+1]=a[i][j]; 70 a[i][1]=tmp; 71 } 72 bool IDA_dfs(int deep) 73 { 74 int i,j; 75 if(deep==maxdeep)return judge(); 76 if(get_h()+deep>maxdeep) return false; 77 78 for(i=1;i<=4;i++) 79 { 80 Left(i); 81 if(IDA_dfs(deep+1))return true; 82 Right(i); 83 84 Right(i); 85 if(IDA_dfs(deep+1))return true; 86 Left(i); 87 } 88 89 for(j=1;j<=4;j++) 90 { 91 Up(j); 92 if(IDA_dfs(deep+1))return true; 93 Down(j); 94 95 Down(j); 96 if(IDA_dfs(deep+1))return true; 97 Up(j); 98 } 99 return false; 100 } 101 int main() 102 { 103 int T,i,j; 104 scanf("%d",&T); 105 while(T--){ 106 for(i=1;i<=4;i++) 107 for(j=1;j<=4;j++) 108 scanf("%d",&a[i][j]); 109 if(judge()){ 110 printf("0\n"); 111 continue; 112 } 113 maxdeep=1; 114 while(maxdeep<=5){ 115 if(IDA_dfs(0))break; 116 maxdeep++; 117 } 118 if(maxdeep<=5)printf("%d\n",maxdeep); 119 else printf("-1\n"); 120 } 121 return 0; 122 }