HDU 1175
来源:互联网 发布:加强校园网络建设 编辑:程序博客网 时间:2024/05/29 04:33
深搜
这道题可以不完全按照深搜做,因为他的转向次数是有限的。而且很少,第一步遍历,后两步走哪就可以直接判断了,判断当前位置与终点之间的最短路是否有阻断。方向总共就四个方向,每个情况最多两种走法。
#include<stdio.h>#include<string.h>int start(int x1,int y1,int x2,int y2,int m[600][600]){ if(x1==x2&&y1==y2)//是否重合 return 0; if(m[x1][y1]!=m[x2][y2])//是否相等 return 0; if(m[x1][y1]==0||m[x2][y2]==0)//是否等于0 return 0; return 1;}int discover(int x,int y,int x2,int y2,int m[600][600])//其实就是最后两步,最后的位置与终点作比较,共分四种情况,共八种走法,一一例举出来判断{ int sumx=0,sumy=0,i; if(x2>=x&&y2>=y) { for(i=1; i<x2-x; i++) sumx+=m[x+i][y]; for(i=1; i<y2-y; i++) sumx+=m[x2][y+i]; for(i=1; i<y2-y; i++) sumy+=m[x][y+i]; for(i=1; i<x2-x; i++) sumy+=m[x+i][y2]; if(sumx==0||sumy==0) return 1; else return 0; } if(x2>=x&&y2<=y) { for(i=1; i<x2-x; i++) sumx+=m[x+i][y]; for(i=1; y-i>y2; i++) sumx+=m[x2][y-i]; for(i=1; y-i>y2; i++) sumy+=m[x][y-i]; for(i=1; i<x2-x; i++) sumy+=m[x+i][y2]; if(sumx==0||sumy==0) return 1; else return 0; } if(x2<=x&&y2>=y) { for(i=1; x-i>x2; i++) sumx+=m[x-i][y]; for(i=1; i<y2-y; i++) sumx+=m[x2][y+i]; for(i=1; i<y2-y; i++) sumy+=m[x][y+i]; for(i=1; x-i>x2; i++) sumy+=m[x-i][y2]; if(sumx==0||sumy==0) return 1; else return 0; } if(x2<=x&&y2<=y) { for(i=1; x-i>x2; i++) sumx+=m[x-i][y]; for(i=1; y-i>y2; i++) sumx+=m[x2][y-i]; for(i=1; y-i>y2; i++) sumy+=m[x][y-i]; for(i=1; x-i>x2; i++) sumy+=m[x-i][y2]; if(sumx==0||sumy==0) return 1; else return 0; }}int dfs(int x1,int y1,int x2,int y2,int m[600][600]){ int i,x,y; for(i=1; i+x1<600; i++)//向下走 { x=x1+i; y=y1; if(x1+i==x2&&y1==y2) //先判断是否已经到了 return 1; if(m[x1+i][y1]!=0) //已经判断到了不可通行的位置,所以这个方向的行走该结束了 break; if(discover(x,y,x2,y2,m))//已经发现满足条件的路,返回main return 1; } for(i=1; i+y1<600; i++)//向右走,上面朝下走不行,从起点开始向右走 { x=x1; y=y1+i; if(x1==x2&&y1+i==y2) return 1; if(m[x1][y1+i]!=0) break; if(discover(x,y,x2,y2,m)) return 1; } for(i=1; x1-i>=0; i++)//向上走 { x=x1-i; y=y1; if(x1-i==x2&&y1==y2) return 1; if(m[x1-i][y1]!=0) break; if(discover(x,y,x2,y2,m)) return 1; } for(i=1; y1-i>=0; i++)//向左走 { x=x1; y=y1-i; if(x1==x2&&y1-i==y2) return 1; if(m[x1][y1-i]!=0) break; if(discover(x,y,x2,y2,m)) return 1; } return 0;}int main (){ int n,m,i,j,q,x1,y1,x2,y2,e,f,map[600][600]; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; memset(map,-1,sizeof(map)); for(i=1; i<=n; i++) { for(j=1; j<=m; j++) { scanf("%d",&map[i][j]); } } scanf("%d",&q); while(q--) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(start(x1,y1,x2,y2,map)) { if(dfs(x1,y1,x2,y2,map)) printf("YES\n"); else printf("NO\n"); } else printf("NO\n"); } } return 0;}
2 0
- hdu 1175
- HDU 1175
- hdu 1175
- HDU 1175
- hdu 1175
- HDU 1175
- hdu 1175
- hdu 1175
- HDU 1175
- hdu 1175
- HDU 1175
- hdu 1175
- hdu 1175 连连看
- hdu 1175 bfs
- hdu 1175 连连看
- hdu 1175 连连看
- HDU 1175 连连看
- HDU 1175 ( 连连看 )
- Coco2d Physics 物理引擎
- Task和Back Stack
- 应用内置embeded tomcat,并打包为fat jar的解决方案
- Maven内置属性及使用
- 生成模型与判别模型
- HDU 1175
- sql基础--怎样查询单列数据
- typedef函数指针用法
- ACM:POJ-1852 Ants
- Android中使用Bundle交换数据
- ConcurrentHashMap使用示例
- swift语言使用正则表达式验证字符串是否为邮箱,手机号,身份证号
- java基础
- 设计模式-单例模式