搜索专题

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 }
View Code

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 }
View Code

 

posted @ 2014-04-18 23:31  芷水  阅读(155)  评论(0编辑  收藏  举报