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){
    if(n*n==now)return true;
    for(int i=0;i<diff;i++){
        if(0==cardnum[i])continue;
        if(0!=now/n&&card[trueorder[now-n]][2]!=card[i][0])continue;      //有上一行就与上一行相邻数字进行对比  
        if(0!=now%n&&card[trueorder[now-1]][1]!=card[i][3])continue;      //有前一个就与前一个相邻数字进行对比
        trueorder[now]=i;                             //前面的条件都成立,就放入已经排好的顺序中
        cardnum[i]--;                                //此卡所在卡种数减一
        if(dfs(now+1))return true;                         //进行下一个排序
        else {
            cardnum[i]++;
        }
    }
    return false;
}
int main()
{
    int game=1,up,rig,dow,lef,j,i;
    while(cin>>n){
        if(n==0)break;
        memset(cardnum,0,sizeof(cardnum));
        memset(card,0,sizeof(card));
        diff=0;
        for( i=0;i<n*n;i++){
            cin>>up>>rig>>dow>>lef;
            for(j=0;j<diff;j++){
               if(card[j][0]==up&&card[j][1]==rig&&card[j][2]==dow&&card[j][3]==lef)break;      //判断是否已经有此卡种   
            }
            if(j==diff){                                //无此卡种则添加此卡种  
                cardnum[j]++;
                diff++;
                card[j][0]=up;
                card[j][1]=rig;
                card[j][2]=dow;
                card[j][3]=lef;
            }
            else cardnum[j]++;
        }  
        if(1!=game)cout<<endl;                        //注意换行   此处被坑了一次
        cout<<"Game "<<game<<": ";                        
        game++;
        if(dfs(0))
        cout<<"Possible\n";
        else cout<<"Impossible\n";
    }
    return 0;
}

ZOJ 1008

时间: 2024-11-05 21:50:47

ZOJ 1008的相关文章

ZOJ 1008 Gnome Tetravex (DFS + 剪枝)

Gnome Tetravex 题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=8 题意:有N*N个方格,每个方格分为上下左右四个部分,每个部分填数字.现在要求重排方块,使得每两个有边相连的方块对应的数字相同. 思路:就是一个简单的搜索,我想了个剪枝,将上下左右四个方向上每个数字对应的是哪几个方块记录下来,但是这个剪枝并没有起很大的作用,还是T了.后来才发现,如果有很多个方块是相同的,会重复搜索,所以需要将相同的方块一起处

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

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

图论 500题——主要为hdu/poj/zoj

转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并查集======================================[HDU]1213   How Many Tables   基础并查集★1272   小希的迷宫   基础并查集★1325&&poj1308  Is It A Tree?   基础并查集★1856   More i

zoj题目分类

饮水思源---zoj 转载自:http://bbs.sjtu.edu.cn/bbscon,board,ACMICPC,file,M.1084159773.A.html 注:所有不是太难的题都被归成了“简单题”,等到发现的时候已经太晚了,我太死脑筋 了……:( 有些题的程序我找不到了,555……:( SRbGa的题虽然都很经典……但是由于其中的大部分都是我看了oibh上的解题报告后做 的,所以就不写了…… 题目排列顺序没有规律……:( 按照个人感觉,最短路有的算做了DP,有的算做了图论. 有些比较

1008. 数组元素循环右移问题 (20)

1008. 数组元素循环右移问题 (20) 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1--AN-1)变换为(AN-M -- AN-1 A0 A1--AN-M-1)(最后M个数循环移至最前面的M个位置).如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法? 输入格式:每个输入包含一个测试用例,第1行输入N ( 1<=N<=100).M(M>=0):第2行输入N个整数,之间用空格