杭电ACM 1175

//杭电ACM 1175
//连连看
#include<iostream>
using namespace std;
int board[1000][1000];
void swap(int&a,int&b)
{
	int temp=a;
	a=b;
	b=temp;
}
bool judge(int h1,int l1,int h2,int l2,int n1,int m1)
{
	int i,j,k,t;
	if(h1==h2)
	{
		for(i=l1+1;i<l2;i++)
			if(board[h1][i])
				break;
		if(i==l2)
			return true;
	}
	if(l1==l2)
	{
		for(i=h1+1;i<l2;i++)
			if(board[i][l2])
				break;
		if(i==h2)
			return true;
	}
	for(k=1;k<=n1;k++)
	{
		for(i=l1+1;i<l2;i++)
			if(board[k][i])
				break;
		if(i==l2)
		{
			if(k<h2)
			{
				for(j=h2-1;j>=k;j--)
					if(board[j][l2])
					{
						j=-1;
						break;
					}
					j++;
			}
			else
			{
				for(j=h2+1;j<=k;j++)
					if(board[j][l2])
					{
						j=-1;
						break;
					}
				j--;
			}
			if(k<h1)
			{
				for(t=h1-1;t>=k;t--)
					if(board[t][l1])
					{
						t=-1;
						break;
					}
					t++;
			}
			else
			{
				for(t=h1+1;t<=k;t++)
					if(board[t][l1])
					{
						t=-1;
						break;
					}
					t--;
			}
			if((j==k)&&(t==k))
				return true;
		}
	}
	for(k=1;k<=m1;k++)
	{
			if(h1<h2)
			{
				for(i=h1+1;i<h2;i++)
					if(board[i][k])
						break;
			}
			else
			{
				for(i=h2+1;i<h1;i++)
					if(board[i][k])
						break;
			}
			if((i==h2)||(i==h1))
			{
				if(k<l2)
				{
					for(j=l2-1;j>=k;j--)
						if(board[h2][j])
						{
							j=-1;
							break;
						}
						j++;
				}
				else
				{
					for(j=l2+1;j<=k;j++)
						if(board[h2][j])
						{
							j=-1;
							break;
						}
						j--;
				}
				if(k<l1)
				{
					for(t=l1-1;t>=k;t--)
						if(board[h1][t])
						{
							t=-1;
							break;
						}
						t++;
				}
				else
				{
					for(t=l1+1;t<=k;t++)
						if(board[h1][t])
						{
							t=-1;
							break;
						}
						t--;
				}
				if((j==k)&&(t==k))
					return true;
			}
	}
	return false;
}
int main()
{
	int m,n,a,q,x1,y1,x2,y2;
	cout<<"输入n和m: ";
	while(cin>>n>>m&&(n+m))
	{
		cout<<"输入"<<n<<"行"<<m<<"列数字: "<<endl;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
			{
				cin>>a;
				board[i][j]=a;
			}
		cout<<"输入询问的次数: ";
		cin>>q;
		cout<<"输入"<<q<<"行"<<"每行四个数: "<<endl;
		for(i=0;i<q;i++)
		{
			cin>>x1>>y1>>x2>>y2;
			if(y1>y2)
			{
				swap(y1,y2);
				swap(x1,x2);
			}
			if(judge(x1,y1,x2,y2,n,m)&&board[x1][y1]==board[x2][y2]&& board[x1][y1])
				cout<<"YES"<<endl;
			else
				cout<<"NO"<<endl;
		
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值