uva 639 - Don't Get Rooked

第一次想简单了,只是按照自己的简单想法写出了其中的一种情况~验证阳历是发现了自己思路上的错误。

然后正确思路很明确了——既然自己只写出一种情况不行,那么把所有的情况都列举一遍,找出其中最大的 可以填入的数 则必然就是正确答案。

由于时间比较紧张,所以代码很糙……但是居然A了……

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char s[10][10];
int aa[30];
int a[10][10];
int b[10][10];
int vis1[10];
int vis2[10];
int cnt,max_;
int n;

void dfs(int cur)
{
    if(a[cur/n][cur%n]==1)
    {
        aa[cur]=2;
        dfs(cur+1);
        return;
    }
    if(cur>=n*n)
    {
        cnt=0;
        memset(b,0,sizeof(b));
        memset(vis1,0,sizeof(vis1));
        memset(vis2,0,sizeof(vis2));
        for(int i=0;i<n*n;i++)
        {
            b[i/n][i%n]=aa[i];
        }

        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(b[i][j]==1)
                {
                    if(!vis1[i]&&!vis2[j])
                    {
                        vis1[i]=1;
                        vis2[j]=1;
                        cnt++;
                    }
                    else
                        return;
                }
                if(b[i][j]==2)
                {
                    vis1[i]=0;
                    vis2[j]=0;
                }
            }
        }
        if(cnt>max_)
            max_=cnt;
        return ;
    }
    aa[cur]=1;
    dfs(cur+1);
    aa[cur]=0;
    dfs(cur+1);
}

int main()
{
    while(scanf("%d",&n)!=EOF&&n)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%s",s[i]);
        }

        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(s[i][j]=='.')
                    a[i][j]=0;
                else
                    a[i][j]=1;
            }
        }
        max_=-1;
        dfs(0);
        printf("%d\n",max_);
    }
    return 0;
}


你可能感兴趣的:(uva,位向量枚举法)