hdu 1401
来源:互联网 发布:java学士后骗局 编辑:程序博客网 时间:2024/05/03 04:40
hdu 1401 从昨天晚上就在做这道题了,orz,被坑了这么久,原因一直是MLE。。。。
欲哭无泪啊,改来改去,还是不能减少内存,后来,我发现其实我太二了,八维数组,我居然用的是int ,orz,难怪MLE,改成char 就不超了。。。
哎呀,得长记性了。。。。话说,这是我做的第一道DBFS,其实和BFS本质上还是一样的,就是多了一个判断,不过效率确实高了。。。orz。。。
还是直接贴代码了。。。
1 #include<iostream> 2 #include<algorithm> 3 #include<queue> 4 #include<cstring> 5 using namespace std; 6 7 char visited[8][8][8][8][8][8][8][8];//用来保存四个棋子的状态 8 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; //上、下、左、右 9 10 struct point { 11 int x,y; 12 }; 13 struct node { 14 struct point p[4]; //一种状态,四个棋子 15 int step; 16 }; 17 //给棋排子序,避免同一个状态重复入队列 18 int cmp(const point &p,const point &q){ 19 if(p.x==q.x) 20 return p.y<q.y; 21 return p.x<q.x; 22 } 23 24 //判断是否可以走 25 int judge(node &s ,int i,int j,int flag){ 26 if( flag==1 ){ 27 if( s.step >=4 )//最多移动4步 28 return 0; 29 s.step ++; 30 } 31 s.p[i].x += dir[j][0]; 32 s.p[i].y += dir[j][1]; 33 if(s.p[i].x >= 0&&s.p[i].x < 8 &&s.p[i].y >=0&&s.p[i].y<8 ){ 34 int k; 35 for(k = 0 ; k< 4 ; k++){ 36 if( i!=k ){ 37 if( s.p[i].x== s.p[k].x&& s.p[i].y==s.p[k].y )//判断是否有点,有点的话,就间隔判断 38 if( flag==1 ) return judge(s ,i ,j, 0);//判断是否跳过相邻的点可以合法走动 39 else return 0; 40 } 41 } 42 //可以走 43 if( k>=4 ){ 44 sort(s.p,s.p+4,cmp); 45 return 1; 46 } 47 } 48 return 0; 49 } 50 51 void bfs(node s1,node s2){ 52 queue<node>Q1,Q2; 53 node ss; 54 Q1.push(s1),Q2.push(s2); 55 visited[s1.p[0].x][s1.p[0].y][s1.p[1].x][s1.p[1].y][s1.p[2].x][s1.p[2].y][s1.p[3].x][s1.p[3].y]='1'; 56 visited[s2.p[0].x][s2.p[0].y][s2.p[1].x][s2.p[1].y][s2.p[2].x][s2.p[2].y][s2.p[3].x][s2.p[3].y]='2'; 57 while((!Q1.empty())||(!Q2.empty())){ 58 if(!Q1.empty()){ 59 for(int i=0;i<4;i++){ 60 //第i个棋子,搜的方向//这是搜走一步的 61 for(int j=0;j<4;j++){ 62 ss=Q1.front(); 63 if(judge(ss,i,j,1)){ 64 if(visited[ss.p[0].x][ss.p[0].y][ss.p[1].x][ss.p[1].y][ss.p[2].x][ss.p[2].y][ss.p[3].x][ss.p[3].y]=='1') 65 continue; 66 //在Q2中已经搜过 67 if(visited[ss.p[0].x][ss.p[0].y][ss.p[1].x][ss.p[1].y][ss.p[2].x][ss.p[2].y][ss.p[3].x][ss.p[3].y]=='2'){ 68 printf("YES\n"); 69 return ; 70 } 71 Q1.push(ss); 72 visited[ss.p[0].x][ss.p[0].y][ss.p[1].x][ss.p[1].y][ss.p[2].x][ss.p[2].y][ss.p[3].x][ss.p[3].y]='1';//在Q1中搜过的标记为'1'; 73 } 74 } 75 } 76 Q1.pop();//出队列的时候一定要4颗棋子4个方向都试过才能出 77 } 78 if(!Q2.empty()){ 79 for(int i=0;i<4;i++){ 80 //第i个棋子,搜的方向//这是搜走一步的 81 for(int j=0;j<4;j++){ 82 ss=Q2.front(); 83 if(judge(ss,i,j,1)){ 84 if(visited[ss.p[0].x][ss.p[0].y][ss.p[1].x][ss.p[1].y][ss.p[2].x][ss.p[2].y][ss.p[3].x][ss.p[3].y]=='2') 85 continue; 86 //在Q1中已经搜过 87 if(visited[ss.p[0].x][ss.p[0].y][ss.p[1].x][ss.p[1].y][ss.p[2].x][ss.p[2].y][ss.p[3].x][ss.p[3].y]=='1'){ 88 printf("YES\n"); 89 return ; 90 } 91 Q2.push(ss); 92 visited[ss.p[0].x][ss.p[0].y][ss.p[1].x][ss.p[1].y][ss.p[2].x][ss.p[2].y][ss.p[3].x][ss.p[3].y]='2'; //在Q2中搜过的标记为'2'; 93 } 94 } 95 } 96 Q2.pop(); 97 } 98 } 99 printf("NO\n");100 }101 102 103 int main(){104 int x,y;105 while(scanf("%d%d",&x,&y)!=EOF){106 node s1,s2;107 s1.p[0].x=x-1,s1.p[0].y=y-1;108 for(int i=1;i<4;i++){109 scanf("%d%d",&x,&y);110 s1.p[i].x=x-1,s1.p[i].y=y-1;111 }112 for(int i=0;i<4;i++){113 scanf("%d%d",&x,&y);114 s2.p[i].x=x-1,s2.p[i].y=y-1;115 }116 s1.step=s2.step=0;117 sort(s1.p,s1.p+4,cmp);118 sort(s2.p,s2.p+4,cmp);119 memset(visited,0,sizeof(visited));120 bfs(s1,s2);121 }122 return 0;123 }
0 0
- hdu 1401
- hdu 1401
- hdu 1401 bfs
- hdu 1401 双向bfs
- hdu 1401双广
- HDU-1401 Solitaire 搜索
- hdu 1401(深搜)
- hdu 1401 (双广)
- hdu 1401 Solitaire(bfs)
- HDU 1401 Solitaire
- HDU 1401 双向BFS !!!
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- Developer连得时候中文都出现了乱码
- hdu 1429
- MFC所有控件随窗口变化的实现
- hdu 1254 推箱子游戏
- hdu 1258
- hdu 1401
- hdu 1455 搜索经典
- hdu 1518 又一道搜索经典
- hdu 1142 记忆化搜索
- floyd 算法的个人理解
- 阿里巴巴开源项目: 基于mysql数据库binlog的增量订阅&消费
- hdu 1548 最短路
- hdu 1598 第一道并查集
- hdu 1599 最小环