hdu 1175 其实真的可以不用搜索!!

原创 2012年03月31日 00:55:29
#include <iostream>
#include <cstdio>

using namespace std;

int n,m,p;
int map[1002][1002];
int dist[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int narrow[1002][1002];

bool solve(int x,int y,int xx,int yy)
{
	if(map[xx][yy]!=map[x][y]) return false;
	if(map[x][y]==0) return false;
	if(x==xx&&y==yy) return false;
     
	for(int i=0;i<4;i++)
	{
		int a=x+dist[i][0];
		int b=y+dist[i][1];
		if(a==xx&&yy==b) return true;
	}
	memset(narrow,0,sizeof(narrow));

	for(int i=y+1;i<=m&&map[x][i]==0;i++)
	{
         narrow[x][i]=1;
		 for(int j=x+1;j<=n&&map[j][i]==0;j++)
			 narrow[j][i]=1;
		 for(int j=x-1;j>=0&&map[j][i]==0;j--)
			 narrow[j][i]=1;
	}
 
	for(int i=y-1;i>0&&map[x][i]==0;i--)
	{
         narrow[x][i]=1;
		 for(int j=x+1;j<=n&&map[j][i]==0;j++)
			narrow[j][i]=1;
		 for(int j=x-1;j>=0&&map[j][i]==0;j--)
			narrow[j][i]=1;
	}   
	for(int i=x-1;i>0&&map[i][y]==0;i--)
	{
         narrow[i][y]=1;
		 for(int j=y+1;j<=m&&map[i][j]==0;j++)
			 narrow[i][j]=1;
		 for(int j=x-1;j>=0&&map[i][j]==0;j--)
			 narrow[i][j]=1;
	}
	for(int i=x+1;i<=n&&map[i][y]==0;i++)
	{
         narrow[i][y]=1;
		 for(int j=y+1;j<=m&&map[i][j]==0;j++)
			 narrow[i][j]=1;
		 for(int j=x-1;j>=0&&map[i][j]==0;j--)
			 narrow[i][j]=1;
	}   

	for(int i=yy+1;i<=m&&map[xx][i]==0;i++)
		if(narrow[xx][i]) return true;
	for(int i=yy-1;i>0&&map[xx][i]==0;i--)
		if(narrow[xx][i]) return true;
    for(int i=xx-1;i>0&&map[i][yy]==0;i--)
		if(narrow[i][yy]) return true;
	for(int i=xx+1;i<=n&&map[i][yy]==0;i++)
		if(narrow[i][yy]) return true;
	return false;

}


int main()
{
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		if(n==0&&m==0) break;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				scanf("%d",&map[i][j]);

		scanf("%d",&p);

		for(int i=0;i<p;i++)
		{
			int x,y,xx,yy;
			scanf("%d%d%d%d",&x,&y,&xx,&yy);
			if(solve(x,y,xx,yy)) puts("YES");
			else puts("NO");
		}
	}
	return 0;
	
}

相关文章推荐

HDU 1175 连连看 (搜索 DFS)

题意很简单,就是我们平时玩的连连看的游戏规则,刚开始用的广搜,刚开始的剪枝不高效导致爆掉队列,使得内存超限,后来发现,bfs先遍历的点不一定是弯数少的点,这样的话如果不专门来更新的话,就会出现运行结果...

HDU1175连连看【搜索】【剪枝】

连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm...

hdu 1175 连连看(BFS的搜索方向与效率问题)

题目链接,点我点我! 之所以写这篇解题报告,主要是讨论一下BFS的优先搜索方向与效率问题,从Time Limits(超过10000ms)到100ms,如此大的一个跨度,深深感到自己之前写的程序有多渣...

ACM 搜索 hdu1175 连连看

Problem Description “连连看”相信很多人都玩过。没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子。如果某两个相同的棋子,可以通过一条线连起来(这条线不能...

HDU1175 连连看 模拟搜索

刚开始写的有点恶心,认为要分为三种情况,所以哗啦啦地写了两种。 写第三种的时候发现原来全部都可以归结为第三种,即用三根折线连起来的情况。   【思路】   首先,若两点坐标相同,返回NO。 ...

连连看 1175 HDU(广度搜索)

问题描述:http://acm.hdu.edu.cn/showproblem.php?pid=1175 思路很清晰,但是因为实现的方式和代码的问题,纠结了好久,最后请牛人(YWJ)帮忙,终于好了...

hdu1175简单的搜索(bfs法)

以转弯次数step作为代价,假设出发就转弯了一次,那么step 扩展节点的时候,如果step==1,由于还有两次转弯的机会,所以所有的节点都扩展。当step==2的时候,只有一次转弯的机会了,那么就...

HDU 1175 连连看(搜索)

连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su...

hdu1175 连连看 搜索

Description “连连看”相信很多人都玩过。没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子。如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),...

HDU 1175 广度优先搜索(BFS)

http://acm.hdu.edu.cn/showproblem.php?pid=1175 题意:能不能将两个位置的棋子(非0)消去,并不能超过两次改变方向. 题型:广度优先搜索(BFS) ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 1175 其实真的可以不用搜索!!
举报原因:
原因补充:

(最多只允许输入30个字)