UVA 211(p215)----The Domino Effect

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define debu
using namespace std;
const int maxn=50;
const int dx[2]= {0,1};
const int dy[2]= {1,0};
int v[maxn];
int cas=0,num;
int m[maxn][maxn];
int flag[maxn][maxn];
int g[maxn][maxn];
void prepare()
{
    int tmp=1;
    for(int i=0; i<7; i++)
        for(int j=i; j<7; j++)
            m[i][j]=m[j][i]=tmp++;
}
void output()
{
    for(int i=1; i<=7; i++)
    {
        for(int j=1; j<=8; j++)
            printf("%4d",flag[i][j]);
        printf("\n");
    }
    printf("\n");
}
void input()
{
    cas++;
    for(int i=1; i<=7; i++)
        for(int j=1; j<=8; j++)
        {
            if(i==1&&j==1) continue;
            scanf("%d",&g[i][j]);
        }
    if(cas!=1) printf("\n\n\n");
    printf("Layout #%d:\n\n",cas);
    for(int i=1; i<=7; i++)
    {
        for(int j=1; j<=8; j++)
            printf("%4d",g[i][j]);
        printf("\n");
    }
    printf("\nMaps resulting from layout #%d are:\n\n",cas);
}
int check(int x)
{
    for(int i=1; i<8; i++)
        if(!flag[x][i]) return 0;
    return 1;
}
void solve(int x,int y)
{
    if(y>8)
    {
        x++;
        y=1;
        if(x>7)
        {
            num++;
            output();
            return ;
        }
    }
    if(y==8)
        if(!check(x)) return ;
    if(flag[x][y]) solve(x,y+1);
    else
    {
        for(int i=0; i<2; i++)
        {
            int xx=x+dx[i];
            int yy=y+dy[i];
            if(xx<8&&y<9&&(!flag[xx][yy]))
            {
                int tmp=m[g[x][y]][g[xx][yy]];
                if(!v[tmp])
                {
                    v[tmp]=1;
                    flag[x][y]=flag[xx][yy]=tmp;
                    solve(x,y+1);
                    v[tmp]=0;
                    flag[x][y]=flag[xx][yy]=0;
                }
            }
        }
    }
}
void init()
{
    num=0;
    memset(flag,0,sizeof(flag));
    memset(v,0,sizeof(v));
}
int main()
{
#ifdef debug
    freopen("in.in","r",stdin);
#endif // debug
    prepare();
    while(scanf("%d",&g[1][1])!=EOF)
    {
        init();
        input();
        solve(1,1);
        printf("There are %d solution(s) for layout #%d.\n",num,cas);
    }
    return 0;
}
题目地址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=4&page=show_problem&problem=147

你可能感兴趣的:(UVA 211(p215)----The Domino Effect)