DomiNo Grid做题记录

D - DomiNo Grid
Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %lld
Description

Dominoes are small, flat, rectangular-shaped game pieces. Domino pieces are usually twice as long as they are wide and are usually made to be exactly half as thick as they are wide so that they can stand on edge without falling over. If we push one end of a queue of dominoes, the whole queue will fall over.


Now, you will be given some descriptions of domino grid with a '.' indicating an open space and an uppercase 'X' indicating a domino and the force used on one domino. You are to compute the ending descriptions. The force consists of two parts : location and direction. There are 8 directions shown below.

direction abbreviation
West : W
NorthWest : V
North : N
NorthEast : Y
East : E
SouthEast : Q
South : S
SouthWest : J

The falling direction of the pushed domino is always the same as the force. Other dominoes will fall over if: 1) it's adjacent with a previous fallen domino. 2) it's within 45 degree of the falling direction of the previous domino.

The direction of falling is the relative position of it to the previous fallen domino. No two dominoes will cause the same domino to fall over simultaneously. See the following example for more details.

XXX
XXX
XXX

We say the outer 8 dominoes are adjacent with the middle one. With a force to east on the middle domino, the 3 dominoes in the third column will fall over and the direction will be northeast, east, southeast. So the ending grid is :

XXY
XEE
XXQ

Input

There are multiple test cases. Each case begins with a line containing two positive integer n and m (1 <= n, m <= 500) that are the number of rows and columns of the grid. The next n lines each with m chars (only '.' and 'X') describe one row of the grid. At last, two integers i, j (ith row, jth column, both i and j start from 1) indicate the location of the force and a char C describes the direction of the force. You can assume that there is a domino at the location (i, j).

Process to the end of file.

Output

Print the ending description of the grid, using the abbreviations for the fallen dominoes.

Print a blank line between cases.

Sample Input

2 4
..XX
XX..
1 3 S
4 4
XXX.
...X
X..X
XXX.
3 1 E

Sample Output

..SX
WJ..

WWV.
...N
E..Y
XQE.



自己写的代码:

#include <iostream>
#include <cstdio>
#include <map>
#include <algorithm>
#include <string>
#include <cstring>
#include <queue>
#include <vector>
#include <cmath>
using namespace std;

#define mxn 150
#define mxe 10010
#define inf 0x3f3f3f3f
#define LL long long
#define mod 1000000007

char s[550][550];
bool vis[550][550];
int n,m;

struct node
{	char d;
	int x,y;
};

void bfs(int x,int y, char dir)
{	queue<node> q;
	node a;
	a.d=dir; a.x=x; a.y=y;
	vis[x][y]=1;
	q.push(a);
	while(!q.empty())
	{	a=q.front();
		s[a.x][a.y]=a.d;
		node nn[3];
		switch(a.d)
		{	case 'E' : { nn[0].x=a.x;nn[1].x=a.x-1;nn[2].x=a.x+1;
							nn[0].y=a.y+1; nn[1].y=a.y+1; nn[2].y=a.y+1;
							nn[0].d=a.d; nn[1].d='Y'; nn[2].d='Q';
							break;
							}
			case 'Y': { nn[0].x=a.x-1; nn[1].x=a.x-1; nn[2].x=a.x;
							nn[0].y=a.y+1; nn[1].y=a.y; nn[2].y=a.y+1;
							nn[0].d=a.d; nn[1].d='N'; nn[2].d='E';
							break;
						 }
			case 'N': { nn[0].x=a.x-1; nn[1].x=a.x-1; nn[2].x=a.x-1;
							nn[0].y=a.y; nn[1].y=a.y-1; nn[2].y=a.y+1;
							nn[0].d=a.d; nn[1].d='V'; nn[2].d='Y';
							break;
						 }
			case 'V': { nn[0].x=a.x-1; nn[1].x=a.x; nn[2].x=a.x-1;
							nn[0].y=a.y-1; nn[1].y=a.y-1; nn[2].y=a.y;
							nn[0].d=a.d; nn[1].d='W'; nn[2].d='N';
							break;
						 }
			case 'W': { nn[0].x=a.x; nn[1].x=a.x+1; nn[2].x=a.x-1;
							nn[0].y=a.y-1; nn[1].y=a.y-1; nn[2].y=a.y-1;
							nn[0].d=a.d; nn[1].d='J'; nn[2].d='V';
							break;
						 }
			case 'J': { nn[0].x=a.x+1; nn[1].x=a.x+1; nn[2].x=a.x;
							nn[0].y=a.y-1; nn[1].y=a.y; nn[2].y=a.y-1;
							nn[0].d=a.d; nn[1].d='S'; nn[2].d='W';
							break;
						 }
			case 'S': { nn[0].x=a.x+1; nn[1].x=a.x+1; nn[2].x=a.x+1;
							nn[0].y=a.y; nn[1].y=a.y+1; nn[2].y=a.y-1;
							nn[0].d=a.d; nn[1].d='Q'; nn[2].d='J';
							break;
						 }
			case 'Q': { nn[0].x=a.x+1; nn[1].x=a.x+1; nn[2].x=a.x;
							nn[0].y=a.y+1; nn[1].y=a.y; nn[2].y=a.y+1;
							nn[0].d=a.d; nn[1].d='S'; nn[2].d='E';
							break;
						 }
		}
		int i;
		for (i=0;i<=3;i++)
		{	if (nn[i].x>0 && nn[i].x<=n && nn[i].y>0 && nn[i].y<=m && s[nn[i].x][nn[i].y]=='X' && vis[nn[i].x][nn[i].y]==0 )
			{	vis[nn[i].x][nn[i].y]=1;
				q.push(nn[i]);
			}
		}
		q.pop();
	}
}

int main()
{	int i,j,x,y;
	char dir;
	bool bl=1;
	while(scanf("%d%d",&n,&m)!=EOF)
	{	getchar();
		for(i=1;i<=n;i++)
		{	for ( j=1;j<=m;j++ ) 
				scanf("%c",&s[i][j]);
			getchar();
		}
		scanf("%d%d",&x,&y);
		getchar();
		scanf("%c",&dir);
		memset(vis,0,sizeof(vis));
		bfs(x,y,dir);
		if (bl) bl=0;
		else printf("\n");
		for(i=1;i<=n;i++)
		{	for ( j=1;j<=m;j++ ) 
				printf("%c",s[i][j]);
			printf("\n");
		}
	}
	return 0;
}

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值