2tle求助
查看原帖
2tle求助
606419
juanjuan666楼主2022/2/4 20:27
#include<bits/stdc++.h>
#include<queue>
#define up(i,a,b) for(int i =a;i<=b;i++)
#define down(i,a,b) for(int i=a;i>=b;i--)
#define N 100000
using namespace std;
int n,m;//n代表迷宫大小,m代表有几个入口点 
char mapp[1001][1001];//迷宫图
int sx[N],sy[N];
int vis[1001][1001],bs[1001][1001];
int fx[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
struct yeah{
	int x,y,b;//坐标和步数 
}; 
int in(int x,int y)//判断是否越界 
{
	if(x>=1&&x<=n&&y>=1&&y<=n)
		return 1;
	return 0;
}
int pdd(int dx,int dy,int x,int y)//判断是不是0和1交替 
{
	if((mapp[dx][dy]-'0')!=(mapp[x][y]-'0'))
		return 1;
	return 0;
}
int bfs(int x,int y)//读取进入的坐标 
{
	queue<yeah> que;
	que.push((yeah){x,y,1});//起点入队 
	int sum=1;//包括起点本身 
	while(!que.empty())
	{
		yeah f = que.front();
		que.pop();
		up(i,0,3)
		{
			int dx = f.x + fx[i][0];
			int dy = f.y + fx[i][1];
			if(in(dx,dy)&&pdd(f.x,f.y,dx,dy)&&vis[dx][dy]==0)
			{
				vis[dx][dy] = -1;
				que.push((yeah){dx,dy,f.b+1});
				sum++;
			}
		}
	}
	return sum;
}

int main()
{
	//输入
	scanf("%d%d",&n,&m);
	string s;
	up(i,1,n)
	{
		cin>>s;
		up(j,1,n)
		{
			mapp[i][j]=s[j-1];	
		}
	}
	up(i,1,m)
	{
		scanf("%d%d",&sx[i],&sy[i]);
	}
	
	//开始查找起点
	up(i,1,m)
	{
        if(vis[sx[i]][sy[i]])//已经走过了 
		{
			printf("%d\n",vis[sx[i]][sy[i]]);
		}
		else
		{
			vis[sx[i]][sy[i]]=-1;
			int sum = bfs(sx[i],sy[i]);
			up(j,1,n)
			{
				up(k,1,n)
				{
					if(vis[j][k]==-1)
					{
						vis[j][k] = sum;
					}
				}
			}
			printf("%d\n",sum);
		} 
	}
	return 0;	
} 
2022/2/4 20:27
加载中...