求改,调两天了!
查看原帖
求改,调两天了!
1053119
hard_learn楼主2024/11/19 13:18
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
vector<int>sum[10005];
//sum存储(x,y)的编号点亮(x2,y2)的编号的灯 
map<int,map<int,int> >q,ff,ft;
//ft为是否能够到达(1,1)
//ff为是否被点亮
//q为(x,y)的编号 
struct st{
	int xx,yy;
}a[10005]; 
//a存储(x,y)的编号相对应的坐标 
int id=0,ans=1;
//id为编号,ans为点亮的灯的数量 
bool flag[10005];
//flag标记编号点有没有来过 
int d1[4]={0,0,1,-1},d2[4]={1,-1,0,0};
bool st(int x,int y){
	for(int i=0;i<4;i++){
		int newx=x+d1[i],newy=y+d2[i];
		if(newx>n||newx<1||newy>n||newy<1){
			continue;
		}
		if(ff[newx][newy]==1&&ft[newx][newy]==2){
			ft[x][y]=2;
			return 1; 
		}
	}
	return 0;
}
void dij(int x,int y){
	for(int i=1;i<=id;i++){
		flag[i]=0;
	}  
	priority_queue<int,vector<int>,greater<int> >s;
	s.push(1);
	flag[1]=1; 
	ff[x][y]=1;
	ft[x][y]=2;
	while(s.empty()==0){
		int now=s.top();
//		cout<<now<<endl;
		s.pop();
		for(int i=0;i<sum[now].size();i++){
			int num=sum[now][i]; //记录开的灯的编号 
			if(ff[a[num].xx][a[num].yy]==0){
				ff[a[num].xx][a[num].yy]=1;
				ans++;
			}
//			cout<<num<<endl;
			if(st(a[num].xx,a[num].yy)==1){
				if(flag[num]==0){
					flag[num]=1;
					s.push(num); 
				}
			}
		}
	}
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			a[++id].xx=i,a[id].yy=j;
			q[i][j]=id;			
		}
	}
	for(int i=1;i<=m;i++){
		int x,y,x2,y2;
		cin>>x>>y>>x2>>y2;		
		sum[q[x][y]].push_back(q[x2][y2]);
//		cout<<q[x][y]<<" "<<q[x2][y2]<<endl;
	}
	for(int i=1;i<=id;i++){
		sort(sum[i].begin(),sum[i].end());
	}
	dij(1,1);
//	for(int i=1;i<=id;i++){
//		for(int j=0;j<sum[i].size();j++){
//			cout<<sum[i][j]<<" ";
//		} 
//		cout<<endl;
//	}
	cout<<ans<<endl;
    return 0;
}    
2024/11/19 13:18
加载中...