n*m的矩陣,其中有k個格子是有圖案的,q個詢問,如果每次詢問的兩個格子上都有圖案,且可以通過最多變相兩次到達(路上不能有其他有圖案的格子),這兩個格子的圖案並得到兩分,否則-1分。
其實仔細想想就是連連看的遊戲模式,比賽中覺得搜索太暴力會T沒敢嘗試,結果其實暴力寫法也才80ms就過了。
直接暴力模擬能不能滿足條件就可以了。
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;
const int maxn=333;
int map[maxn][maxn];
int n,m;
int k;
int q;
int ans;
int x1,y1;
int x2,y2;
int fx[maxn],sx[maxn];
int fy[maxn],sy[maxn];
bool solve()
{
memset(fx,0,sizeof(fx));
memset(sx,0,sizeof(sx));
memset(fy,0,sizeof(fy));
memset(sy,0,sizeof(sy));
fx[x1]=1;
sx[x2]=1;
for(int i=x1+1;i<m;i++)
{
if(map[i][y1]==0)
{
fx[i]=1;
}
else
{
break;
}
}
for(int i=x1-1;i>=0;i--)
{
if(map[i][y1]==0)
{
fx[i]=1;
}
else
{
break;
}
}
for(int i=x2+1;i<m;i++)
{
if(map[i][y2]==0)
{
sx[i]=1;
}
else
{
break;
}
}
for(int i=x2-1;i>=0;i--)
{
if(map[i][y2]==0)
{
sx[i]=1;
}
else
{
break;
}
}
for(int i=0;i<m;i++)
{
if(sx[i]&&fx[i])
{
bool flag=1;
for(int j=min(y1,y2)+1;j<max(y1,y2);j++)
{
if(map[i][j])
{
flag=0;
break;
}
}
if(flag)
{
return true;
}
}
}
fy[y1]=1;
sy[y2]=1;
for(int i=y1+1;i<n;i++)
{
if(map[x1][i]==0)
{
fy[i]=1;
}
else
{
break;
}
}
for(int i=y1-1;i>=0;i--)
{
if(map[x1][i]==0)
{
fy[i]=1;
}
else
{
break;
}
}
for(int i=y2+1;i<n;i++)
{
if(map[x2][i]==0)
{
sy[i]=1;
}
else
{
break;
}
}
for(int i=y2-1;i>=0;i--)
{
if(map[x2][i]==0)
{
sy[i]=1;
}
else
{
break;
}
}
for(int i=0;i<n;i++)
{
if(fy[i]&&sy[i])
{
bool flag=1;
for(int j=min(x1,x2)+1;j<max(x2,x1);j++)
{
if(map[j][i])
{
flag=0;
break;
}
}
if(flag)
{
return true;
}
}
}
return false;
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
ans=60;
memset(map,0,sizeof(map));
scanf("%d",&k);
for(int i=0;i<k;i++)
{
scanf("%d%d",&x1,&y1);
map[x1][y1]=1;
}
scanf("%d",&k);
while(k--)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(map[x1][y1]==0||map[x2][y2]==0)
{
ans--;
}
else if(solve())
{
ans+=2;
map[x1][y1]=0;
map[x2][y2]=0;
}
else
{
ans--;
}
printf("%d\n",ans);
}
}
return 0;
}