求问题 WA
  • 板块P1141 01迷宫
  • 楼主DrAlfred
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/4/2 23:41
  • 上次更新2023/10/28 04:48:45
查看原帖
求问题 WA
583610
DrAlfred楼主2022/4/2 23:41
#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y;//x和y
	node(int a,int b){//强制类型转换
		x=a;y=b;
	}
};
const int dx[4]={1,-1,0,0};//方向数组
const int dy[4]={0,0,-1,1};
int n,m,ind=1,sx,sy;//ind为当前连通块index,sx,sy为询问坐标
int rec[1001][1001];//rec为连通块
char _map[1001][1001];//_map为原始地图
map <int,int> hash0;//hash0为连通块对应的大小
inline bool ok(int &x1,int &x2,char &c){
	return (x1>=1&&x1<=n)&&(x2>=1&&x2<=n)&&(_map[x1][x2]!=c)&&(!rec[x1][x2]);
	//x,y轴满足条件_map不相等,未处理连通块
}
inline int bfs(int x1,int x2){
	int ans=1;//计算初始点
	queue <node> que;//队列
	que.push(node(x1,x2));
	rec[x1][x2]=ind;//处理连通块
	while(!(que.empty())){
		node last=que.front();
		que.pop();//取队首出队
		int lx=last.x,ly=last.y;//取上一次的x,y
		for(int i=0;i<4;i++){
			int nx=lx+dx[i],ny=ly+dy[i];//计算新的x,y
			if(ok(nx,ny,_map[lx][ly])){
				++ans;
				rec[nx][ny]=ind;
				que.push(node(nx,ny));
			}
		}
	}
	return ans;
}
int main(int argc,const char *argv[]){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%s",_map[i]);
	}
	/*puts("----------------------------------");
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			putchar(_map[i][j]);
			if(!rec[i][j]){
				hash0[ind]=bfs(i,j);
				ind+=1; 
			}
		}
		putchar('\n');
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			printf("%d",rec[i][j]);
		}
		putchar('\n');
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			printf("%d\t",hash0[rec[i][j]]);
		}
		putchar('\n');
	}*/
	for(int i=1;i<=m;i++){
		scanf("%d %d",&sx,&sy);
		printf("%d\n",hash0[rec[sx][sy]]);
	}
	return 0;
}
2022/4/2 23:41
加载中...