Maze
2016-02-15 19:35
190 查看
#include<iostream> #include <cstring> #include<cstdio> using namespace std; int n; int Sum = 0 ; int ans = 0 ; int dJx[4] = { -1 , 0 , 1 , 0 }; int dJy[4] = { 0 , 1 , 0 , -1 }; struct node { int x; int y; int num; }; node a[10002]; node b[10002]; char Map[102][102]; bool bo_F [102][102]; bool bo_J [102][102]; bool Check1 ( int x , int y ) { return x>0 && x<=n && y>0 && y<=n ; } bool Check2(int i,int j) { return ( a[i].x == b[j].x && ( a[i].y == b[j].y || a[i].y-1 == b[j].y || a[i].y+1 == b[j].y ) ) || ( a[i].y == b[j].y && ( a[i].x == b[j].x || a[i].x-1 == b[j].x || a[i].x+1 == b[j].x ) ); } int main() { freopen("maze.in","r",stdin); freopen("maze.out","w",stdout); int Fx,Fy,Jx,Jy; memset ( bo_J , true , sizeof bo_J ); memset ( bo_F , true , sizeof bo_F ); cin >> n ; for ( int i = 1 ; i <= n ; i ++ ) for ( int j = 1 ; j <= n ; j ++ ) { cin >> Map[i][j]; if ( Map[i][j] == 'F' ) { Fx = i ; Fy = j ; } if ( Map[i][j] == 'J' ) { Jx = i ; Jy = j ; } if ( Map[i][j] != '*' ) Sum ++ ; } int qhead = 1 ; int qtail = 1 ; int s = 0 ; int k = 0; a[1].x = Jx; a[1].y = Jy; a[1].num = 1; bo_J[Jx][Jy] = false ; while ( qhead <= qtail && k <= Sum ) { for ( int i = 0 ; i < 4 ; i ++ ) { int d = ( i + s ) % 4 ; int x = a[qhead].x + dJx[d] ; int y = a[qhead].y + dJy[d] ; if ( Map[x][y] != '*' && Check1( x ,y ) ) { qtail ++ ; a[qtail].x = x; a[qtail].y = y; a[qtail].num = a[qhead].num + 1 ; s = ( i + s ) % 4 ; k ++ ; break; } } qhead ++ ; } int len_J = qtail ; qhead = 1 ; qtail = 1 ; b[1].x = Fx; b[1].y = Fy; b[1].num = 1; bo_F[Fx][Fy] = false ; while ( qhead <= qtail ) { for ( int i = 0 ; i < 4 ; i++ ) { int x = b[qhead].x + dJx[i] ; int y = b[qhead].y + dJy[i] ; if ( bo_F[x][y] && Map[x][y] != '*' && Check1 ( x , y ) ) { bo_F[x][y] = false ; qtail ++ ; b[qtail].x = x; b[qtail].y = y; b[qtail].num = b[qhead].num + 1 ; } } ++qhead; } int len_F = qtail ; /* for (int i=1;i<=len_J;++i){ cout << a[i].num << ' '; } cout << endl; for (int j=1;j<=len_F;++j){ cout << b[j].num << ' '; } cout << endl; */ for ( int i = 1 , j = 1 ; i <= len_J , j <= len_F ; ) { while ( a[i].num != b[j].num ) { if ( a[i].num > b[j].num ) j++; else i++; } if (Check2(i,j)) { cout << a[i].num - 1 << endl ; return 0; } else j ++ ; } cout << "No solution" << endl ; return 0 ; }
相关文章推荐
- Tour-Guide解题报告 - 哈密尔顿环问题
- 位运算除法 - frisbee
- 比萨(Pizza)解题报告 - 暴力枚举加位运算加速
- 细菌(disease)解题报告 - 搜索与回朔
- A-B Problem(Dec)解题报告 - 单调队列
- 哈希 - O(1)的摊销复杂度 - 搜索与哈希(上)
- 题目题解简单收集
- Escape解题报告 - 提前计算对于程序的帮助 - 贪心算法与动态规划
- 2015-8-7 ACM 模拟赛制测试总结
- 来自洛谷八月月赛的一道数学问题 - 子串和 - 组合数学
- USACO 2015 US OPEN BRONZE 铜组 题解
- [转] 常用的CSS命名规则
- iOS应用分发与内测(一)
- 排列(decimal)
- Java实现生命周期管理机制
- 南海石门中学第六届创新班 2015-4-25 课时总结
- 南海石门中学第六届创新班 2015-5-16 课时总结
- 南海石门中学第六届创新班 2015-5-23 课时总结
- 南海石门中学第六届创新班 2015-5-30 课时总结
- 数学游戏(mathgame)解题方法 - N皇后位运算解法,14皇后亦在1秒中