zoukankan      html  css  js  c++  java
  • Magic Star

    http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=24022

    思路:搜索

    具体看注释。

    View Code
    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    char s[10][100];
    int a[10][20];
    int visit[50];
    int num[50];
    int add[50];
    int cnt=0;
    int mm=0;
    void init()
    {
        memset(visit,0,sizeof(visit));
        memset(a,0,sizeof(a));
        for(int i=1;i<=5;i++)
        {
            for(int j=0;j<=8;j++)
            {
                if(s[i][j]=='.')continue;
                else
                if(s[i][j]=='x')num[++cnt]=0;
                else
                num[++cnt]=s[i][j]-'A'+1,visit[num[cnt]]=1;
                //每一个需要填数的空对应一个编号 从 1 到 12
                //如果数字已经使用,标记
            }
        }
    }
    int check()
    {
        if(num[1]+num[3]+num[6]+num[8]>26)return 0;
        if(num[1]+num[4]+num[7]+num[11]>26)return 0;
        if(num[2]+num[3]+num[4]+num[5]>26)return 0;
        if(num[8]+num[9]+num[10]+num[11]>26)return 0;
        if(num[2]+num[6]+num[9]+num[12]>26)return 0;
        if(num[5]+num[7]+num[10]+num[12]>26)return 0;
        return 1;
    }
    void go()
    {
        for(int i=1;i<=5;i++)
            for(int j=0;j<=8;j++)
                if(s[i][j]!='.')
                    s[i][j]=(char)('A'+num[++mm]-1);
    }
    void output()
    {
        for(int i=1;i<=5;i++)
            cout<<s[i]<<endl;
    }
    void dfs(int k)
    {
        if(!check())
        return ;//如果某一个需要满足的方向大于了26 停止搜索
        if(k==13)
        {
            go();
            output();
    //如果已经填到了第13个数 那么说明已经填好了因为之前没有一个
    //方向是大于26的输出之
            exit(0);
        }
        if(num[k])
        dfs(k+1);//如果该编号已经填了数字 搜索下一个编号
        else
        for(int i=1;i<=12;i++)
        if(!visit[i])
        {
            visit[i]=1;
            num[k]=i;
            dfs(k+1);
            visit[i]=0;//返回时要清楚利用的标记 清楚了现场
            num[k]=0;
        }
        return ;
    }
    int main()
    {
        while(scanf("%s",s[1])!=EOF)
        {
            for(int i=2;i<=5;i++)
                scanf("%s",s[i]);
            init();
            dfs(1);
        }
        return 0;
    }
  • 相关阅读:
    中文词频统计及词云制作 25
    实验一 DOS实验 25
    字符串练习 25
    Python、循环的练习 25
    用requests库和BeautifulSoup4库爬取新闻列表 25
    爬取新闻列表 25
    Mockito使用总结
    20121116
    20121123
    20121115
  • 原文地址:https://www.cnblogs.com/cs1003/p/2664427.html
Copyright © 2011-2022 走看看