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;
}
posted on 2012-08-30 21:12  一把刷子  阅读(182)  评论(0编辑  收藏  举报