uva 639 - Don't Get Rooked

来源:互联网 发布:java动态代理应用场景 编辑:程序博客网 时间:2024/06/02 06:16

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

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

由于时间比较紧张,所以代码很糙……但是居然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;}


0 0
原创粉丝点击