E - Children of the Candy Corn -DFS模拟+bfs
2015-07-28 23:56
204 查看
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <queue> #include <algorithm> #include <iostream> using namespace std; char map[45][45]; char map2[45][45]; int n,m; int dir1_left[][2]={1,0,0,-1,-1,0}; int dir2_left[][2]={0,-1,-1,0,0,1}; int dir3_left[][2]={-1,0,0,1,1,0}; int dir4_left[][2]={0,1,1,0,0,-1}; int dir1_r[][2]={-1,0,0,-1,1,0}; int dir2_r[][2]={0,1,-1,0,0,-1}; int dir3_r[][2]={1,0,0,1,-1,0}; int dir4_r[][2]={0,-1,1,0,0,1}; int dir[][2]={0,1,0,-1,1,0,-1,0}; int pace_l; int pace_r; int flag; int pace; int legal(int x,int y) { if (x>=1&&y>=1&&x<=n&&y<=m) return 1; return 0; } struct node { int x,y; int time; }; queue <node> qq; int bfs(int x,int y) { node tmp; while(!qq.empty()) { tmp=qq.front(); qq.pop(); int i; for (i=0;i<4;i++) { int r=tmp.x+dir[i][0]; int c=tmp.y+dir[i][1]; if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E')) { node tt=tmp; tt.x=r; tt.y=c; tt.time++; if (map[r][c]=='E') { pace=tt.time; return 0; } map[r][c]='#'; qq.push(tt); } } } } int dfs_l(int x,int y,int posi) { int i; if (map[x][y]=='E') { pace_l=pace; flag=1; return 0; } if (posi==1) { for (i=0;i<3;i++) { int r=x+dir1_left[i][0]; int c=y+dir1_left[i][1]; if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E')) { // if (map[r][c]=='.') map[r][c]='#'; int pposi; if (i==0) pposi=4; if (i==1) pposi=1; if (i==2) pposi=2; pace++; dfs_l(r,c,pposi); pace++; if (flag==1) return 0; map[r][c]='.'; } } } if (posi==2) { for (i=0;i<3;i++) { int r=x+dir2_left[i][0]; int c=y+dir2_left[i][1]; if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E')) { // if (map[r][c]=='.') map[r][c]='#'; int pposi; if (i==0) pposi=1; if (i==1) pposi=2; if (i==2) pposi=3; pace++; dfs_l(r,c,pposi); pace++; if (flag==1) return 0; map[r][c]='.'; } } } if (posi==3) { for (i=0;i<3;i++) { int r=x+dir3_left[i][0]; int c=y+dir3_left[i][1]; if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E')) { // if (map[r][c]=='.') map[r][c]='#'; int pposi; if (i==0) pposi=2; if (i==1) pposi=3; if (i==2) pposi=4; pace++; dfs_l(r,c,pposi); pace++; if (flag==1) return 0; map[r][c]='.'; } } } if (posi==4) { for (i=0;i<3;i++) { int r=x+dir4_left[i][0]; int c=y+dir4_left[i][1]; if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E')) { // if (map[r][c]=='.') map[r][c]='#'; int pposi; if (i==0) pposi=3; if (i==1) pposi=4; if (i==2) pposi=1; pace++; dfs_l(r,c,pposi); pace++; if (flag==1) return 0; map[r][c]='.'; } } } return 0; } int dfs_r(int x,int y,int posi) { int i; if (map[x][y]=='E') { pace_r=pace; flag=1; return 0; } if (posi==1) { for (i=0;i<3;i++) { int r=x+dir1_r[i][0]; int c=y+dir1_r[i][1]; if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E')) { // if (map[r][c]=='.') map[r][c]='#'; int pposi; if (i==0) pposi=2; if (i==1) pposi=1; if (i==2) pposi=4; pace++; dfs_r(r,c,pposi); pace++; if (flag==1) return 0; map[r][c]='.'; } } } if (posi==2) { for (i=0;i<3;i++) { int r=x+dir2_r[i][0]; int c=y+dir2_r[i][1]; if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E')) { // if (map[r][c]=='.') map[r][c]='#'; int pposi; if (i==0) pposi=3; if (i==1) pposi=2; if (i==2) pposi=1; pace++; dfs_r(r,c,pposi); pace++; if (flag==1) return 0; map[r][c]='.'; } } } if (posi==3) { for (i=0;i<3;i++) { int r=x+dir3_r[i][0]; int c=y+dir3_r[i][1]; if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E')) { // if (map[r][c]=='.') map[r][c]='#'; int pposi; if (i==0) pposi=4; if (i==1) pposi=3; if (i==2) pposi=2; pace++; dfs_r(r,c,pposi); pace++; if (flag==1) return 0; map[r][c]='.'; } } } if (posi==4) { for (i=0;i<3;i++) { int r=x+dir4_r[i][0]; int c=y+dir4_r[i][1]; if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E')) { // if (map[r][c]=='.') map[r][c]='#'; int pposi; if (i==0) pposi=1; if (i==1) pposi=4; if (i==2) pposi=3; pace++; dfs_r(r,c,pposi); pace++; if (flag==1) return 0; map[r][c]='.'; } } } return 0; } int main() { int i,j; int t; cin>>t; while(t--) { memset(map,0,sizeof(map)); int sx,sy; cin>>m>>n; getchar(); for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { scanf("%c",&map[i][j]); map2[i][j]=map[i][j]; if (map[i][j]=='S') { sx=i; sy=j; } } getchar(); } int posi; if (legal(sx+1,sy)&&map[sx+1][sy]=='.') posi=4; if (legal(sx,sy+1)&&map[sx][sy+1]=='.') posi=3; if (legal(sx-1,sy)&&map[sx-1][sy]=='.') posi=2; if (legal(sx,sy-1)&&map[sx][sy-1]=='.') posi=1; flag=0; pace=1; dfs_l(sx,sy,posi); for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { map[i][j]=map2[i][j]; } } flag=0; pace=1; dfs_r(sx,sy,posi); for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { map[i][j]=map2[i][j]; } } pace=1; while(!qq.empty()) qq.pop(); node tmp; tmp.x=sx; tmp.y=sy; tmp.time=1; qq.push(tmp); bfs(sx,sy); printf("%d %d %d\n",pace_l,pace_r,pace); } return 0; }
相关文章推荐
- 数组-指针
- POJ2425 A Chess Game(博弈)
- iOS 开发一些小技巧(收集整理)
- HDOJ 5323 Solve this interesting problem BFS搜索
- CSU1660(深搜)
- 15.07.28
- HDU 3501 Calculation 2(欧拉函数)
- 初识JavaScript
- Speedup,Scaleup,Sizeup
- Android获取图片资源的4种方式
- DDSM数据库转换图像格式——LJPEG转为PNG格式
- hdu 4444 Walk(预处理+暴力)
- 重载操作符
- 结构体运用
- 对象的复制与赋值操作
- 大数据系列修炼-Scala课程04
- 《离思》——元稹
- 服务器客户端回射程序-自己设计包的结构
- root的方法大体上有以下三种
- java web 资源地址写法