UOJ 225 [UR #15]奥林匹克五子棋

来源:互联网 发布:中国大数据专家委员会 编辑:程序博客网 时间:2024/05/22 17:48

构造。

除了一些n=1,m=1,k=1……之类的特殊情况外,我们能够保证的最优解肯定是这样的:
OXOXO
OXOXO
XOXOX
XOXOX
OXOXO

那么k>2肯定都是有解。

然后判掉特殊情况,把这种图暴力跑出来输出就好了- -,一些细节要注意好

UOJ比赛出这种题真的好吗

#include<cstdio>#define N 550int map[N][N], n, m, k;void solve(int &p, int k){    int x=p/1000, y=p%1000;    for(int j = y+1; j <= m; j++)        if(map[x][j]==k)            {            p=x*1000+j;            return;        }    for(int i = x+1;i <= n; i++)        for(int j = 1; j <= m; j++)            if(map[i][j]==k)                {                p=i*1000+j;                return;            }}int main(){    scanf("%d%d%d",&n,&m,&k);    if(k==1)    {        printf("-1\n");        return 0;    }    if(k==2 && n>=2 && m>=2)    {        printf("-1\n");        return 0;    }    if(n==1)    {        for(int i = 1; i <= m; i++)            printf("%d %d\n",1,i);        return 0;    }    if(m==1)    {        for(int i = 1; i <= n; i++)            printf("%d %d\n",i,1);        return 0;    }    if(n&1)        for(int i = 1; i <= 505; i++)            for(int j = 1; j <= 505; j++)                if((i-1)%4<=1)                {                    if(j&1)map[i][j]=1;                    else map[i][j]=-1;                }                else                {                    if(j&1)map[i][j]=-1;                    else map[i][j]=1;                }    else        for(int i = 1; i <= 505; i++)            for(int j = 1; j <= 505; j++)                if(i%4<=1)                {                    if(j&1)map[i][j]=1;                    else map[i][j]=-1;                }                else                {                    if(j&1)map[i][j]=-1;                    else map[i][j]=1;                }    int px=1001, py=1002;    for(int i = 1, ii = n*m; i <= ii; i++)    {        if(i&1)        {            printf("%d %d\n",px/1000,px%1000);            solve(px,1);        }        else        {            printf("%d %d\n",py/1000,py%1000);            solve(py,-1);        }    }} 
1 0
原创粉丝点击