2017CCSP-01 五子棋 简单模拟

题面和数据

对于每个空格,先定义一个变量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;
}

posted @ 2019-10-04 14:59  NTS100K  阅读(285)  评论(0编辑  收藏  举报
浏览器标题切换end