对于每个空格,先定义一个变量cnt=0,表示空格填充后对五子数量的变化,四个方向进行两边搜索,设对于每个方向连续的白棋子分别为\(wa\),\(wb\),有以下几种情况.
- \(wa>=5 \&\&wb>=5\) 填空后cnt--
- \(wa,wb\)只有一个大于等于5,填空后cnt不变
- \(wa,wb\)都小于5,且\(wa+wb>=4\),填空后cnt++
四个方向都判断之后,如果cnt>=0,那么输出该点即可.
出了一个小错误
while(inband(ti,tj)==true&&a[ti][tj ]='w')
ti和tj有可能是负的,再访问下标就会出错,可以把判断是不是放进while循环里.
int dx[]={1,1,0,1};
int dy[]={1,0,1,-1};
int n;
bool inband(int x,int y)
{
return x>=0&&y>=0&&x<=n-1&&y<=n-1;
}
string a[45];
int ans[2000];
int cur=0;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]!='*')continue;
int cnt=0;
for(int k=0;k<=3;k++)
{
int wa=0,wb=0;
int ti=i+dx[k];
int tj=j+dy[k];
while(inband(ti,tj)==true)
{
if(a[ti][tj]!='w')break;///panduan
wa++;
ti+=dx[k];
tj+=dy[k];
}
ti=i-dx[k];
tj=j-dy[k];
while(inband(ti,tj)==true)
{
if(a[ti][tj]!='w')break;
wb++;
ti-=dx[k];
tj-=dy[k];
}
if(wa>=5&&wb>=5)
{
cnt--;
continue;
}
if(wa>=5||wb>=5)
{
continue;
}
else if(wa+wb>=4)
{
cnt++;
}
}
if(cnt>0)
{
printf("%d %d\n",j,i);
}
}
}
return 0;
}