麻将游戏(BFS)(队列)
2017-01-22 16:31
176 查看
1283: 麻将游戏
时间限制: 1 Sec 内存限制: 128 MB提交: 59 解决: 10
[提交][状态][讨论版]
题目描述
在一种"麻将"游戏中,游戏是在一个有W*H格子的矩形平板上进行的。每个格子可以放置一个麻将牌,也可以不放(如图所示)。玩家的目标是将平板上的所有可通过一条路径相连的两张相同的麻将牌,从平板上移去。最后如果能将所有牌移出平板,则算过关。这个游戏中的一个关键问题是:两张牌之间是否可以被一条路径所连接,该路径满足以下两个特性:
1. 它由若干条线段组成,每条线段要么是水平方向,要么是垂直方向。
2. 这条路径不能横穿任何一个麻将牌 (但允许路径暂时离开平板)。
这是一个例子:
在(1,3)的牌和在(4, 4)的牌可以被连接。(2, 3)和(3, 4)不能被连接。
你的任务是编一个程序,检测两张牌是否能被一条符合以上规定的路径所连接。
输入
第一行有两个整数w,h (1<=w,h<=75),表示平板的宽和高。接下来h行描述平板信息,每行包含w个字符,如果某格子有一张牌,则这个格子上有个'X',否则是一个空格。平板上最左上角格子的坐标为(1,1),最右下角格子的坐标为(w,h)。接下来的若干行,每行有四个数x1, y1, x2, y2 ,且满足1<=x1,x2<=w,1<=y1,y2<=h,表示两张牌的坐标(这两张牌的坐标总是不同的)。如果出现连续四个0,则表示输入结束。输出
对于每一对牌输出占一行,为连接这一对牌的路径最少包含的线段数。如果不存在路径则输出0。样例输入
5 4 XXXXX X X XXX X XXX 2 3 5 3 1 3 4 4 2 3 3 4 0 0 0 0
样例输出
4 3 0
提示
来源
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; struct data { int x,y; }k; queue<data> q; string nn; int n,m,bx,by,ex,ey,map[100][100],maps[100][100]; void init(){ for(int i=0;i<=n+1;i++) for(int j=0;j<=m+1;j++) map[i][j]=maps[i][j]; } int main() { cin>>m>>n; getline(cin,nn); memset(maps,0x7f,sizeof(map)); for(int i=1;i<=n;i++){ char c; for(int j=1;j<=m;j++){ scanf("%c",&c); if(c=='X')maps[i][j]=-1; } getline(cin,nn); } while(1){ cin>>by>>bx>>ey>>ex; init(); map[bx][by]=0; map[ex][ey]=2139062143; if(bx==0 && by==0 && ex==0 && ey==0) return 0; k.x=bx;k.y=by; q.push(k); while(!q.empty()) { data h; h=q.front(); q.pop(); int rx=h.x,ry=h.y; int i=1; while(rx+i>=0 && rx+i<=n+1 && ry>=0 && ry<=m+1 && map[rx+i][ry]!=-1 && map[rx][ry]+1<=map[rx+i][ry]){ map[rx+i][ry]=map[rx][ry]+1; k.x=rx+i;k.y=ry;q.push(k); i++; } i=1; while(rx-i>=0 && rx-i<=n+1 && ry>=0 && ry<=m+1 && map[rx-i][ry]!=-1 && map[rx][ry]+1<=map[rx-i][ry]){ map[rx-i][ry]=map[rx][ry]+1; k.x=rx-i;k.y=ry;q.push(k); i++; } i=1; while(rx>=0 && rx<=n+1 && ry+i>=0 && ry+1<=m+1 && map[rx][ry+i]!=-1 && map[rx][ry]+1<=map[rx][ry+i]){ map[rx][ry+i]=map[rx][ry]+1; k.x=rx;k.y=ry+i;q.push(k); i++; } i=1; while(rx>=0 && rx<=n+1 && ry-i>=0 && ry-i<=m+1 && map[rx][ry-i]!=-1 && map[rx][ry]+1<=map[rx][ry-i]){ map[rx][ry-i]=map[rx][ry]+1; k.x=rx;k.y=ry-i;q.push(k); i++; } } if(map[ex][ey]!=2139062143) cout<<map[ex][ey]<<endl; else cout<<0<<endl; } }
相关文章推荐
- 【51Nod】1459 - 迷宫游戏(bfs & 优先队列 & 最短路)
- hdu1072 Nightmare(优先队列,BFS)
- ZOJ 2913 Bus Pass(BFS+滚动队列)
- poj 2312 Battle City【bfs+优先队列】
- 麻将游戏的听牌算法
- 找朋友(bfs)搜索(还有队列思想)
- CCF-201604-4 游戏(三维BFS)
- CCF 习题 201604-4 游戏 (BFS -- 三维vis数组)
- hdu 1242 Rescue(优先队列 && 广搜BFS)
- BFS+队列优先
- 最近正在计划编写一个麻将游戏
- 题目1091:棋盘游戏 -- DFS BFS
- HDU 1180 诡异的楼梯(BFS,用优先队列过)
- 临沂手机电玩城|手机麻将游戏开发|棋牌APP定制|齐鲁约牌吧加盟
- NYOJ--353--bfs+优先队列--3D dungeon
- HDU 1026 Ignatius and the Princess I 优先队列 +BFS.
- 栈和队列的综合运用——球钟趣味游戏代码(初学者)
- POJ 3126 Prime Path 第一道BFS 循环队列,AC的很辛苦!
- poj 2312 bfs+优先队列 入门题
- hdu 2209 翻纸牌游戏 模拟||bfs