设为首页 加入收藏

TOP

两个相连的点差要大于1题
2014-04-06 17:41:00 来源: 作者: 【 】 浏览:129
Tags:两个 相连 大于

  题意

  每两个相连的点差要大于1。

  思路

  之前用我是一个点一个点的判断,但是老是错了,最后想了想还是要八个点一起判断。

  代码

    #include
    #include
    #include
    int Map = {
    { 0, 1, 1, 1, 0, 0, 0, 0 },
    { 1, 0, 1, 0, 1, 1, 0, 0 },
    { 1, 1, 0, 1, 1, 1, 1, 0 },
    { 1, 0, 1, 0, 0, 1, 1, 0 },
    { 0, 1, 1, 0, 0, 1, 0, 1 },
    { 0, 1, 1, 1, 1, 0, 1, 1 },
    { 0, 0, 1, 1, 0, 1, 0, 1 },
    { 0, 0, 0, 0, 1, 1, 1, 0 } };
    int visit , in , ans ; // 搜索标记、输入、答案
    int sign; // sign==1时的输入数组直接用in[]
    int ABS(int x){
    if (x >= 0)
    return x;
    return -x;
    }
    int ok() // 判断当前搜索的一组是否符合
    {
    for (int i = 0; i < 8; i++)
    for (int j = 0; j < 8; j++)
    if (Map[i][j] && ABS(in[i] - in[j]) == 1)
    return 0;
    return 1;
    }
    void dfs(int a)
    {
    if (a == 8 && ok()){
    sign++;
    for (int i = 0; i<8; i++){
    ans[i] = in[i];
    }
    }
    if (sign > 1)
    return;
    if (in[a] != 0)
    dfs(a + 1);
    for (int i = 1; i <= 8; i++)
    {
    if (!visit[i]){
    visit[i] = 1;
    in[a] = i;
    dfs(a + 1);
    in[a] = 0;
    visit[i] = 0;
    }
    }
    }
    int main()
    {
    int t, Case = 0;
    scanf("%d", &t);
    while (t--)
    {
    memset(visit, 0, sizeof(visit));
    for (int i = 0; i < 8; i++){
    scanf("%d", &in[i]);
    visit[in[i]] = 1;
    }
    sign = 0;
    dfs(0);
    printf("Case %d: ", ++Case);
    if (sign == 0)
    puts("No answer");
    else if (sign == 1){
    for (int i = 0; i < 7; i++)
    printf("%d ", ans[i]);
    printf("%d\n", ans );
    }
    else
    puts("Not unique");
    }
    return 0;
    }

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇输出整形数据的最大值和最小值 下一篇C语言万年历代码

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: