hdu 1252

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1252

题意都读了半天,orz...

给出n个结点,每两个结点之间都有一个线路想通,不过有不同的颜色,然后给三个piece,分别在三个初始位置,piece移动的条件是通过的路径的颜色必须要与另外两个piece所在位置之间的路径颜色想同,求使三个点移动到同一个位置上所需要的最小步数……

开个三位数组记录一下状态就好了,简单bfs.

View Code
 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<queue>

 5 using namespace std;

 6 #define MAXN 55

 7 struct Node{

 8     int x,y,z;

 9     int step;

10 };

11 int n,x,y,z;

12 char map[MAXN][MAXN];

13 bool mark[MAXN][MAXN][MAXN];

14 

15 bool bfs(){

16     queue<Node>Q;

17     Node p,q;

18     memset(mark,false,sizeof(mark));

19     p.x=x,p.y=y,p.z=z,p.step=0;

20     mark[p.x][p.y][p.z]=true;

21     Q.push(p);

22     while(!Q.empty()){

23         p=Q.front();

24         Q.pop();

25         if(p.x==p.y&&p.x==p.z){

26             printf("%d\n",p.step);

27             return true;

28         }

29         for(int i=1;i<=n;i++){

30             if(map[p.x][i]==map[p.y][p.z]&&!mark[i][p.y][p.z]){

31                 mark[i][p.y][p.z]=true;

32                 q.x=i,q.y=p.y,q.z=p.z,q.step=p.step+1;

33                 Q.push(q);

34             }

35             if(map[p.y][i]==map[p.x][p.z]&&!mark[p.x][i][p.z]){

36                 mark[p.x][i][p.z]=true;

37                 q.x=p.x,q.y=i,q.z=p.z,q.step=p.step+1;

38                 Q.push(q);

39             }

40             if(map[p.z][i]==map[p.x][p.y]&&!mark[p.x][p.y][i]){

41                 mark[p.x][p.y][i]=true;

42                 q.x=p.x,q.y=p.y,q.z=i,q.step=p.step+1;

43                 Q.push(q);

44             }

45         }

46     }

47     return false;

48 }

49 

50 

51 int main(){

52     while(scanf("%d",&n),n){

53         scanf("%d%d%d",&x,&y,&z);

54         for(int i=1;i<=n;i++)

55             for(int j=1;j<=n;j++)

56                 scanf(" %c",&map[i][j]);

57         if(!bfs())

58             puts("impossible");

59     }

60     return 0;

61 }

 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1484

思路:这道题主要就是处理墙的问题,我们可以记录每个网格的四个方向是否有墙存在,这个只需在输入墙的时候处理一下就行了,然后就是一般的bfs了。

View Code
 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<cmath>

 5 #include<queue>

 6 #include<string>

 7 using namespace std;

 8 #define MAXN 9

 9 struct Node{

10     int x,y;

11     string path;

12 };

13 

14 struct Edge{

15     bool N,S,W,E;

16 }map[MAXN][MAXN];//记录每一个格子的四周是否可以走

17 

18 bool mark[MAXN][MAXN];

19 Node st,ed;

20 

21 void bfs(){

22     memset(mark,false,sizeof(mark));

23     queue<Node>Q;

24     Node p,q;

25     mark[st.x][st.y]=true;

26     Q.push(st);

27     while(!Q.empty()){

28         p=Q.front();

29         Q.pop();

30         if(p.x==ed.x&&p.y==ed.y){

31             cout<<p.path<<endl;

32         }

33         if(!map[p.x][p.y].E){

34             q=p;q.x+=1;

35             if(q.x>=1&&q.x<=6&&q.y>=1&&q.y<=6&&!mark[q.x][q.y]){

36                 mark[q.x][q.y]=true;

37                 q.path+='E';

38                 Q.push(q);

39             }

40         }

41         if(!map[p.x][p.y].W){

42             q=p;q.x-=1;

43             if(q.x>=1&&q.x<=6&&q.y>=1&&q.y<=6&&!mark[q.x][q.y]){

44                 mark[q.x][q.y]=true;

45                 q.path+='W';

46                 Q.push(q);

47             }

48         }

49         if(!map[p.x][p.y].N){

50             q=p;q.y-=1;

51             if(q.x>=1&&q.x<=6&&q.y>=1&&q.y<=6&&!mark[q.x][q.y]){

52                 mark[q.x][q.y]=true;

53                 q.path+='N';

54                 Q.push(q);

55             }

56         }

57         if(!map[p.x][p.y].S){

58             q=p;q.y+=1;

59             if(q.x>=1&&q.x<=6&&q.y>=1&&q.y<=6&&!mark[q.x][q.y]){

60                 mark[q.x][q.y]=true;

61                 q.path+='S';

62                 Q.push(q);

63             }

64         }

65     }

66 }

67 

68 

69 

70 int main(){

71     int x1,y1,x2,y2;

72     while(scanf("%d%d",&x1,&y1),(x1+y1)){

73         scanf("%d%d",&x2,&y2);

74         st.x=x1,st.y=y1;

75         ed.x=x2,ed.y=y2;

76         memset(map,false,sizeof(map));

77         for(int i=1;i<=3;i++){

78             scanf("%d%d%d%d",&x1,&y1,&x2,&y2);

79             if(x1==x2){

80                 if(y1>y2)swap(y1,y2);

81                 for(int j=y1+1;j<=y2;j++){

82                     map[x1][j].E=map[x1+1][j].W=true;

83                 }

84             }else {

85                 if(x1>x2)swap(x1,x2);

86                 for(int j=x1+1;j<=x2;j++){

87                     map[j][y1].S=map[j][y1+1].N=true;

88                 }

89             }

90         }

91         bfs();

92     }

93     return 0;

94 }

 

你可能感兴趣的:(HDU)