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 连连看(搜索)

上周实验课上学妹问我的题目,当时我顺手写了个shensou

hdu1175(教你记录搜索时方向的变化次数)

#include #include #include #include #include #include #include #include #include #include #include ...

hdu 1175 [连连看] dfs搜索

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1175 题目大意:= = 因为是中文题,就不多说了。  题目对两块棋子能否消除的限制为 两者之间的...

Hdu1175 - 连连看 - 广度优先搜索

#include #include int to[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int mark[1005][1005]; int map[1005][1005...

【搜索】[HDU1175]连连看

题目 分析:这道题看到的第一反应应该就是BFS或者DFS,裸的DFS、BFS显然会TLE,所以我就想用A*,不过好像并不好写启发函数。 枚举步数不行,就枚举边吧。因为允许有两次转折...

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,如此大的一个跨度,深深感到自己之前写的程序有多渣...

HDU 1175 广度优先搜索(BFS)

http://acm.hdu.edu.cn/showproblem.php?pid=1175 题意:能不能将两个位置的棋子(非0)消去,并不能超过两次改变方向. 题型:广度优先搜索(BFS) ...

HDU1175 连连看 模拟搜索

刚开始写的有点恶心,认为要分为三种情况,所以哗啦啦地写了两种。 写第三种的时候发现原来全部都可以归结为第三种,即用三根折线连起来的情况。   【思路】   首先,若两点坐标相同,返回NO。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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