HDU 5547 (DFS暴力)

#include "cstring"
#include "cstdio"
#include "string.h"
#include "cstdio"
#include "iostream"
using namespace std;
char mmap[10][10];
int num_cnt[10];
int row_cnt[10][10];
int column_cnt[10][10];
int flag;
typedef struct node
{
    int m,n;
}node;
node list[25];
int myflag=0;
void num_check(int m,int n)
{
    if(m<=2&&n<=2)
    {
        if(mmap[1][1]!='*')
            num_cnt[mmap[1][1]-'0']++;
        if(mmap[1][2]!='*')
            num_cnt[mmap[1][2]-'0']++;
        if(mmap[2][1]!='*')
            num_cnt[mmap[2][1]-'0']++;
        if(mmap[2][2]!='*')
            num_cnt[mmap[2][2]-'0']++;
    }
    if(m>=3&&n<=2)
    {
        if(mmap[3][1]!='*')
            num_cnt[mmap[3][1]-'0']++;
        if(mmap[3][2]!='*')
            num_cnt[mmap[3][2]-'0']++;
        if(mmap[4][1]!='*')
            num_cnt[mmap[4][1]-'0']++;
        if(mmap[4][2]!='*')
            num_cnt[mmap[4][2]-'0']++;
    }
    if(m<=2&&n>=3)
    {
        if(mmap[1][3]!='*')
            num_cnt[mmap[1][3]-'0']++;
        if(mmap[1][4]!='*')
            num_cnt[mmap[1][4]-'0']++;
        if(mmap[2][3]!='*')
            num_cnt[mmap[2][3]-'0']++;
        if(mmap[2][4]!='*')
            num_cnt[mmap[2][4]-'0']++;
    }
    if(m>=3&&n>=3)
    {
        if(mmap[3][3]!='*')
            num_cnt[mmap[3][3]-'0']++;
        if(mmap[3][4]!='*')
            num_cnt[mmap[3][4]-'0']++;
        if(mmap[4][3]!='*')
            num_cnt[mmap[4][3]-'0']++;
        if(mmap[4][4]!='*')
            num_cnt[mmap[4][4]-'0']++;
    }

}
void dfs(int step)
{
    if(step==flag)
        return;
    node now=list[step];
    memset(num_cnt,0,sizeof(num_cnt));
    num_check(now.m,now.n);
    if(row_cnt[now.m][1]==0&&num_cnt[1]==0&&column_cnt[now.n][1]==0)
    {
        mmap[now.m][now.n]='1';
        if(step==flag-1)
        {
            myflag=1;
            return;
        }
        row_cnt[now.m][1]++;
        column_cnt[now.n][1]++;
        dfs(step+1);
        if(myflag==1)
            return;
        mmap[now.m][now.n]='*';
        row_cnt[now.m][1]--;
        column_cnt[now.n][1]--;
    }
    if(row_cnt[now.m][2]==0&&num_cnt[2]==0&&column_cnt[now.n][2]==0)
    {
        mmap[now.m][now.n]='2';
        if(step==flag-1)
        {
            myflag=1;
            return;
        }
        row_cnt[now.m][2]++;
        column_cnt[now.n][2]++;
        dfs(step+1);
        if(myflag==1)
            return;
        mmap[now.m][now.n]='*';
        row_cnt[now.m][2]--;
        column_cnt[now.n][2]--;
    }
    if(row_cnt[now.m][3]==0&&num_cnt[3]==0&&column_cnt[now.n][3]==0)
    {
        mmap[now.m][now.n]='3';
        if(step==flag-1)
        {
            myflag=1;
            return;
        }
        row_cnt[now.m][3]++;
        column_cnt[now.n][3]++;
        dfs(step+1);
        if(myflag==1)
            return;
        mmap[now.m][now.n]='*';
        row_cnt[now.m][3]--;
        column_cnt[now.n][3]--;
    }
    if(row_cnt[now.m][4]==0&&num_cnt[4]==0&&column_cnt[now.n][4]==0)
    {
        mmap[now.m][now.n]='4';
        if(step==flag-1)
        {
            myflag=1;
            return;
        }
        row_cnt[now.m][4]++;
        column_cnt[now.n][4]++;
        dfs(step+1);
        if(myflag==1)
            return;
        mmap[now.m][now.n]='*';
        row_cnt[now.m][4]--;
        column_cnt[now.n][4]--;
    }

}
void print()
{
    for(int i=1;i<=4;i++)
        printf("%s\n",mmap[i]+1);
}
int main()
{
    int cas;
    scanf("%d",&cas);
    for(int i=1;i<=cas;i++)
    {
        myflag=0;
        memset(mmap,0,sizeof(mmap));
        memset(row_cnt,0,sizeof(row_cnt));
        memset(column_cnt,0,sizeof(column_cnt));
        flag=1;
        for(int j=1;j<=4;j++)
        {
            scanf("%s",mmap[j]+1);
            for(int k=1;k<=4;k++)
            {
                if(mmap[j][k]=='*')
                {
                    list[flag].m=j;
                    list[flag].n=k;
                    flag++;
                }
                else
                {
                    row_cnt[j][mmap[j][k]-'0']++;
                    column_cnt[k][mmap[j][k]-'0']++;
                }
            }
        }
        /*
        if(flag==1)
        {
            printf("Case #%d:\n",i);
            print();
            continue;
        }*/
        dfs(1);
        printf("Case #%d:\n",i);
        print();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值