4395: [Usaco2015 dec]Switching on the Lights|暴力

广搜 保证不重复进队

然后多搜几遍直到不能更新答案为止

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<algorithm>
#include<iostream>
#define T 43333
using namespace std;
int sc()
{
	int i=0; char c=getchar();
	while(c>'9'||c<'0') c=getchar();
	while(c>='0'&&c<='9') i=i*10+c-'0',c=getchar();
	return i;
}
int Head[T],Nxt[T],Lst[T];
int head[T],nxt[T],lst[T];
int a[22222],b[11111],c[22222];
int id[111][111],q[52222];
int n,m,cnt,tot,Tot,ans=1;
bool jud(int x)
{
	if(!a[x]||b[x]) return 0;
	return 1;
}
void insert(int x,int y)
{
	lst[++tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;
}
void Add(int x,int y)
{
	if(x==0||y==0) return ;
	Lst[++Tot]=y;
	Nxt[Tot]=Head[x];
	Head[x]=Tot;
}
int main()
{
	n=sc(),m=sc();
	for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) id[i][j]=++cnt;
	for(int i=1; i<=m; i++)
	{
		int x=sc(),y=sc(),s=sc(),e=sc();
		insert(id[x][y],id[s][e]);
	}
	for(int i=1; i<=n; i++)
	    for(int j=1; j<=n; j++)
	    {
	    	Add(id[i][j],id[i-1][j]);
	    	Add(id[i][j],id[i+1][j]);
	    	Add(id[i][j],id[i][j+1]);
	    	Add(id[i][j],id[i][j-1]);
	    }
	int last=0,tot=0;
	while(1)
	{
		int l=1,r=2;q[1]=1;a[1]=1;
	    memset(b,0,sizeof(b));
	    while(l<r)
	    {
		    int x=q[l++]; 
		    for(int i=head[x]; i; i=nxt[i]) 
		    {
		    	if(!a[lst[i]]) ans++;
		        a[lst[i]]=1;
		    }
	    	for(int i=Head[x]; i; i=Nxt[i])
		        if(jud(Lst[i]))
		        {
		        	b[Lst[i]]=1;
		        	q[r++]=Lst[i];
		        }
		}
		if(ans==last)break;
		last=ans;
	}
	cout << ans;
	return 0;
}


你可能感兴趣的:(暴力)