hdu 2514

来源:互联网 发布:sqlserver增量备份 编辑:程序博客网 时间:2024/06/05 08:59
一个简单的dfs,在没有重复的填完数字后再用ok检验。之前我用错,造成很多无解。
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 10;int num[maxn];int vis[maxn], cnt, ans[maxn];int ok(){    if(abs(num[0] - num[1]) != 1 && abs(num[0] - num[2]) != 1 && abs(num[0] - num[3]) != 1&&       abs(num[1] - num[2]) != 1 && abs(num[1] - num[4]) != 1 && abs(num[1] - num[5]) != 1 &&       abs(num[2] - num[3]) != 1 && abs(num[2] - num[4]) != 1 && abs(num[2] - num[5]) != 1 &&       abs(num[2] - num[6]) != 1 && abs(num[3] - num[5]) != 1 && abs(num[3] - num[6]) != 1 &&       abs(num[4] - num[5]) != 1 && abs(num[4] - num[7]) != 1 && abs(num[5] - num[6]) != 1 &&       abs(num[5] - num[7]) != 1 && abs(num[6] - num[7]) != 1) return true;    else return false;}void cop(){    for(int i = 0; i < 8; i++)        ans[i] = num[i];}int dfs(int deep){    if(deep == 8 && ok()) {cnt++; cop();return true;}    if(cnt >= 2) return false;    if(!num[deep])    {        for(int i = 1; i <= 8; i++)        {            if(!vis[i])            {                num[deep] = i;                vis[i] = 1;                if(dfs(deep + 1) == false) return false;                num[deep] = 0;                vis[i] = 0;            }        }    }    else if(dfs(deep + 1) == false) return false;}int main(){    int n;    scanf("%d", &n);    for(int kase = 1; kase <= n; kase++)    {        cnt = 0;        memset(vis, 0, sizeof(vis));        for(int i = 0; i < 8; i++)        {            scanf("%d", &num[i]);            vis[num[i]] = 1;        }        dfs(0);        printf("Case %d: ", kase);        if(cnt == 0) printf("No answer\n");        else if(cnt == 1)        {            for(int i = 0; i < 7; i++)                printf("%d ", ans[i]);            printf("%d\n", ans[7]);        }        else printf("Not unique\n");    }    return 0;}