HDU 1175 连连看

1175
部分代码,关键代码未写

#include<bits/stdc++.h>
using namespace std;
int a[1010][1010],b[1010][1010];
int n,m,q;
struct zuobiao{
	int x,y;
	int p,q;
}z;
void judge(int z1,int z2){
	if()//不知道怎么写
		printf("YES\n");
	else
		printf("NO\n");
}
int main(){
	while(scanf("%d%d",&n,&m)&&(m+n)){
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++){
				scanf("%d",&a[i][j]);
				getchar();
			}
		scanf("%d",&q);
		for(int k=1;k<=q;k++){
			for(int i=1;i<=4;i++)
				scanf("%d",&b[k][i]);
			z.x=b[k][1],z.y=b[k][2];
			z.p=b[k][3],z.q=b[k][4];
			judge(a[z.x][z.y],a[z.p][z.p]);
		}
	}
	return 0;
} 

应该将“线的转折次数不超过两次”作为条件,再使用dfs。
devc++运行样例都通过,提交显示编译错误

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int ma[N][N],vis[N][N];
int n,m,q,sx,sy,ex,ey;
int move[][2]={{1,0},{0,1},{-1,0},{0,-1}};
int flag;
bool bound(int x,int y){
	if(x<=0||y<=0||x>n||y>m||vis[x][y])
		return true;
	return false;
}
void dfs(int x,int y,int p,int q){
	if(flag||q>2)
		return;
	if(q==2&&(x!=ex&&y!=ey))
		return;
	if(x==ex&&y==ey&&q<=2){
		flag=1;
		return;
	}
	for(int i=0;i<4;i++){
		int tx=x+move[i][0],ty=y+move[i][1];
		if(bound(tx,ty))
			continue;
		if(ma[tx][ty]==0||tx==ex&&ty==ey){
			vis[tx][ty]=1;
			if(p==-1||p==i)
				dfs(tx,ty,i,q);
			else
				dfs(tx,ty,i,q+1);
			vis[tx][ty]=0;
		}
	}
	return;
}
int main(){
	while(scanf("%d%d",&n,&m)&&(n+m)){
		memset(ma,0,sizeof(ma));
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				scanf("%d",&ma[i][j]);
		scanf("%d",&q);
		for(int i=1;i<=q;i++){
			scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
			memset(vis,0,sizeof(vis));
			flag=0;
			if(ma[sx][sy]==ma[ex][ey]&&ma[ex][ey])
				dfs(sx,sy,-1,0);
			if(flag)
				printf("YES\n");
			else
				printf("NO\n");
		}
	}
	return 0;
} 

依然Compilation Error

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int ma[N][N],vis[N][N];
int n,m,q,sx,sy,ex,ey;
int move[][2]={{1,0},{0,1},{-1,0},{0,-1}};
int flag;
bool bound(int x,int y){
	if(x<=0||y<=0||x>n||y>m||vis[x][y])
		return true;
	return false;
}
void dfs(int x,int y,int p,int q){
	if(flag||q>2)
		return;
	if(q==2&&(x!=ex&&y!=ey))
		return;
	if(x==ex&&y==ey&&q<=2){
		flag=1;
		return;
	}
	for(int i=0;i<4;i++){
		int tx=x+move[i][0],ty=y+move[i][1];
		if(bound(tx,ty))
			continue;
		if(ma[tx][ty]==0||tx==ex&&ty==ey){
			vis[tx][ty]=1;
			if(p==-1||p==i)
				dfs(tx,ty,i,q);
			else
				dfs(tx,ty,i,q+1);
			vis[tx][ty]=0;
		}
	}
	return;
}
int main(){
	while(scanf("%d%d",&n,&m)&&(n+m)){
		memset(ma,0,sizeof(ma));
		int i,j,k;
		for(i=1;i<=n;i++)
			for(j=1;j<=m;j++)
				scanf("%d",&ma[i][j]);
		scanf("%d",&q);
		for(k=1;k<=q;k++){
			scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
			memset(vis,0,sizeof(vis));
			flag=0;
			if(ma[sx][sy]==ma[ex][ey]&&ma[ex][ey])
				dfs(sx,sy,-1,0);
			if(flag)
				printf("YES\n");
			else
				printf("NO\n");
		}
	}
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值