ZOJ 1008 Gnome Tetravex (DFS + 剪枝)

Gnome Tetravex

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=8

题意:有N*N个方格,每个方格分为上下左右四个部分,每个部分填数字。现在要求重排方块,使得每两个有边相连的方块对应的数字相同。

思路:就是一个简单的搜索,我想了个剪枝,将上下左右四个方向上每个数字对应的是哪几个方块记录下来,但是这个剪枝并没有起很大的作用,还是T了。后来才发现,如果有很多个方块是相同的,会重复搜索,所以需要将相同的方块一起处理,用一个sum[]值来表示该种方块的数目。

代码:

#include<map>
#include<set>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<fstream>
#include<cstring>
#include<ctype.h>
#include<iostream>
#include<algorithm>
#define INF (1<<30)
#define PI acos(-1.0)
#define mem(a, b) memset(a, b, sizeof(a))
#define rep(i, n) for (int i = 0; i < n; i++)
#define debug puts("===============")
typedef long long ll;
using namespace std;
struct node {
    int x[4];
    bool operator == (const node &T) const {
        for (int i = 0; i < 4; i++) if (x[i] != T.x[i]) return false;
        return true;
    }
}e[26];
vector<int> T[4][10];
int n;
bool flag = false;
int a[30];
int sum[30];
void dfs(int t) {
    if (flag) return ;
    if (t == n * n) {
        flag = true;
        return ;
    }
    if (t < n) {
        int u = e[a[t - 1]].x[1];
        for (int i = 0; i < T[3][u].size(); i++) {
            int v = T[3][u][i];
            if (sum[v] > 0) {
                sum[v]--, a[t] = v;
                dfs(t + 1);
                if (flag) return ;
                sum[v]++;
            }
        }
    }
    else {
        int u = e[a[t - n]].x[2];
        for (int i = 0; i < T[0][u].size(); i++) {
            int v = T[0][u][i];
            if (sum[v] > 0) {
                bool ok = true;
                if (t % n) {
                    if (e[a[t - 1]].x[1] != e[v].x[3]) ok = false;
                }
                if (ok) {
                    sum[v]--, a[t] = v;
                    dfs(t + 1);
                    if (flag) return ;
                    sum[v]++;
                }
            }
        }
    }
    return ;
}
int main () {
    int cnt = 1;
    while(~scanf("%d", &n), n) {
        if (cnt != 1) puts("");
        rep(i, 10) {
             rep(j, 4) {
                T[j][i].clear();
             }
        }
        int x;
        memset(sum, 0, sizeof(sum));
        rep(i, n * n) {
            rep(j, 4) {
                scanf("%d", &x);
                e[i].x[j] = x;
                T[j][x].push_back(i);
            }
            int k;
            for (k = 0; k < i; k++) if (e[k] == e[i]) {
                sum[k]++;
                break;
            }
            if (k == i) {
                sum[k]++;
            }
        }
        flag = false;
        for (int i = 0; i < n * n; i++) if (sum[i]) {
            sum[i]--;
            a[0] = i;
            dfs(1);
            if (flag) break;
            sum[i]++;
        }
        printf("Game %d: ", cnt);
        if (!flag) puts("Impossible");
        else puts("Possible");
        cnt++;
    }
    return 0;
}

ZOJ 1008 Gnome Tetravex (DFS + 剪枝),布布扣,bubuko.com

时间: 2024-12-14 18:13:22

ZOJ 1008 Gnome Tetravex (DFS + 剪枝)的相关文章

zoj 1008 Gnome Tetravex (dfs+枚举)

Gnome Tetravex Time Limit: 10 Seconds      Memory Limit: 32768 KB Hart is engaged in playing an interesting game, Gnome Tetravex, these days. In the game, at the beginning, the player is given n*n squares. Each square is divided into four triangles m

ZOJ Problem Set - 1008 Gnome Tetravex (DFS+剪枝)

ZOJ Problem Set - 1008 Gnome Tetravex Time Limit: 10 Seconds      Memory Limit: 32768 KB Hart is engaged in playing an interesting game, Gnome Tetravex, these days. In the game, at the beginning, the player is given n*n squares. Each square is divide

ZOJ 1008 Gnome Tetravex(DFS)

Gnome Tetravex Time Limit: 10 Seconds      Memory Limit: 32768 KB Hart is engaged in playing an interesting game, Gnome Tetravex, these days. In the game, at the beginning, the player is given n*n squares. Each square is divided into four triangles m

[ZOJ 1008]Gnome Tetravex (dfs搜索 + 小优化)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1008 题目大意:给你n*n的矩阵,每个格子里有4个三角形,分别是上右下左,每个三角形里面标记了数字,问你能否通过移动这n*n个格子,使得相邻两个三角形具有相同的数字? dfs暴搜,dfs(x,y)代表当前要放(x,y)这个位置. 然后枚举给定的每个格子. 如果说可以放,就dfs下一个格子. 这一道题需要把相同的格子压缩起来,也就是说为了节省时间,可以记录相同的格

zoj 1008 Gnome Tetravex

开放式存储阵列为每平方米有几个,否则,超时-- #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <st

ZOJ1008 Gnome Tetravex(DFS)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1008 题意: 哈特近来一直在玩有趣的 Gnome Tetravex 游戏.在游戏开始时,玩家会得到 n×n(n≤5) 个正方形.每个正方形都被分成 4个标有数字的三角形(数字的范围是 0到9).这四个三角形分 别被称为"左三角形"."右三角形"."上三角形"和"下三角形".例如,图 2.12(

ZOJ Seven-Segment Display 暴力dfs + 剪枝

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3954 0 = on     1 = off A seven segment code of permutation p is a set of seven segment code derived from the standard code by rearranging the bits into the order indicated by p. For exampl

1008 Gnome Tetravex

练习使用DPS的题,不知道有无别的做法,思路不复杂.形式是统计并且进行数字配对. 1 #include <stdio.h> 2 3 int m,n,f,sub[25][4],note[25],ans[25]; 4 5 void ini(){ 6 int i,j,top,right,bottom,left; 7 for(i=0;i<25;i++){ 8 for(j=0;j<4;j++) 9 sub[i][j]=0; 10 note[i]=0; 11 ans[i]=0; 12 } 13

ZOJ 1008

这一题用了DFS对每一种方法进行尝试,直到有一种成功的就possible: #include <iostream>#include "string.h"using namespace std;int diff;int card[26][4]; //用于记录不同卡片的上.右.下.左.方向的数字int cardnum[26]; //记录每一种卡片的个数int trueorder[26]; //记录已经排好序的卡片是哪一种卡片,int n; bool dfs(int now){