Gnome Tetravex
zoj1008:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1008
题目意思是有一个游戏,即给出一个图,该图是由n*n个小正方形组成,每个小正方形又由4个三角形组成,要求用这n*n个小正方形拼成一个图,该图的每个小正方形的相邻的三角形的中间的数是相同的
题解:dfs从左到右边,从上到下,一个一个放,并且进行判断,是否合理,如果合理就放置,反之则回溯。
- #include<iostream>
- #include<cstring>
- #include<algorithm>
- #include<cstdio>
- using namespace std;
- int map[][]; //记录不同行的四个三角形
- int n,cur; //行数和当前的种类数(也就是有多少个不同行)
- int result[]; //记录已经放置的方块的
- int counts[]; //记录每一种木块的个数
- bool dfs(int num,int n){
- if(num==n*n)return ;//找到了就爱返回true
- for(int i=;i<cur;i++){//遍历每一种方块注意这里是0~~cur-1;
- if(!counts[i]) continue; //如果当前种类的方块数的数目为零,则跳过
- if(num%n!=){//注意这里是处理第一列的情形:因为对于第一列,没有更左边的方块需要判断,
- //所以没一行的第一个不需要与左边的方块进行判断,直接跳过,这里乜嘢可以改成几个if作为判断语句
- if(map[i][]!=map[result[num-]][]) //把当前的种类的方块与上一个进行计较,因为这里的上一个一定是当前左边的额
- continue;
- }
- if(num/n!=){//这里是处理第一行的情形,因为第一行的方块不需要与上一行进行比较,0——n-1的木块都不需要判断
- if(map[i][]!=map[result[num-n]][])
- continue;
- }
- result[num]=i; //记录本次的可行的木块种类
- counts[i]--; //可行则该种类的木块数目减一
- if(dfs(num+,n))//继续放第num+1块,
- return ;
- else
- counts[i]++;//如果没有找到要恢复现场,这里很重要
- }
- return ;
- }
- int main(){
- int ab=;
- int t=;
- while(scanf("%d",&n)&&n){
- if(ab)
- printf("\n");
- ab=;
- cur=;
- memset(map,,sizeof(map));
- memset(counts,,sizeof(counts)) ; //注意这里的清空处理
- int a,b,c,d;
- for(int i=;i<n*n;i++){
- bool flag=true;
- scanf("%d%d%d%d",&a,&b,&c,&d);
- for(int j=;j<cur;j++){
- if(map[j][]==a&&map[j][]==b&&map[j][]==c&&map[j][]==d)
- {
- counts[j]++;
- flag=false;
- break;
- }
- } //统计相同的木块数目
- if(flag){
- map[cur][]=a;
- map[cur][]=b;
- map[cur][]=c;
- map[cur][]=d;
- counts[cur]++;
- cur++;
- }
- }
- if(dfs(,n)) //注意这里是从0开始的,因为你储存map的时候的下标是从0开始的
- printf("Game %d: Possible\n",t++);
- else
- printf("Game %d: Impossible\n",t++);
- }
- }
Gnome Tetravex的更多相关文章
- ZOJ 1008 Gnome Tetravex(DFS)
Gnome Tetravex Time Limit: 10 Seconds Memory Limit: 32768 KB Hart is engaged in playing an inte ...
- [ZOJ 1008]Gnome Tetravex (dfs搜索 + 小优化)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1008 题目大意:给你n*n的矩阵,每个格子里有4个三角形,分别是 ...
- ZOJ 1008 Gnome Tetravex(DFS)
题目链接 题意 : 将n*n个正方形进行排列,需要判断相邻的正方形的相邻三角形上边的数字是不是都相等. 思路 : 只知道是个深搜,一开始不知道怎么搜,后来看了题解才明白,就是说不是自己去搜,而是将给定 ...
- 1008 Gnome Tetravex
练习使用DPS的题,不知道有无别的做法,思路不复杂.形式是统计并且进行数字配对. #include <stdio.h> ][],note[],ans[]; void ini(){ int ...
- zoj 1008 Gnome Tetravex
开放式存储阵列为每平方米有几个,否则,超时-- #include <stdio.h> #include <string.h> #include <iostream> ...
- ZOJ1008 Gnome Tetravex
DFS+剪枝~ #include<bits/stdc++.h> using namespace std; ][]; int N; int cnt; ]; ]; unordered_map& ...
- POJ题目细究
acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP: 1011 NTA 简单题 1013 Great Equipment 简单题 102 ...
- 【转】POJ百道水题列表
以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...
- 如何保存gnome的linux的 会话?相当于windows下的休眠?
在关机前, 你进行的所有操作, 的集合, 就叫做你跟 linux系统 机器间的 一次 会话, 一个session. linux 可以 在关机时保存 这些session, 保存这些打开的窗口 和程序. ...
随机推荐
- android 08 AndroidManifest.xml
AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xm ...
- mysql优化21条
今天一个朋友向我咨询怎么去优化 MySQL,我按着思维整理了一下,大概粗的可以分为21个方向. 还有一些细节东西(table cache, 表设计,索引设计,程序端缓存之类的)先不列了,对一个系统,初 ...
- Qt数据库sqlite总结
QSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类封装数据库所有记录QSqlRelationalTableModelQSqlQueryMo ...
- 查看pid
可以使用ps -ef | grep httpd查看PID 然后kill –l PID
- 还在用ListView?
还在用Lisview?RecyclerView都已经出来一年多了! 想必大家多或多或少的接触过或者了解过RecyclerView,为什么没有用起来,原因大概如下? ListView我用的挺好的,为什么 ...
- Android layout的横竖屏处理
一.layout-land和layout-prot的区别与使用 默认情况下,创建的Android项目里只有一个layout文件夹,尽管这样也可以横竖屏切换用,但是某些布局横屏过后闲的格外的丑,如下图 ...
- JS计算指定日期是距今的第几周,星期几
无意中在百度知道上发现这样一个问题,就抽时间见写了一个函数. 首先我们需要明确,既然是指定日期距今的第几周,那么就要知道指定的日期是什么,而且是不能确定的,会根据使用者不同而得到不同的日期,所以我们需 ...
- java操作excel常用的两种方式
Excel是我们平时工作中比较常用的用于存储二维表数据的,JAVA也可以直接对Excel进行操作,在这篇博客中将为大家介绍两种操作Excel的方式,分别为:jxl和poi. 对于两者的区别网上有测试如 ...
- C++前置++与后置++的区别与重载
++属于单目运算符,前置与后置的实现代码不一样,下面以整数自增为例: // 前置++,返回自增后的值,且返回的是一个左值 int& operator++(){ *this += 1; retu ...
- cocos2dx JAVA,C++互相调用函数
C++调用JAVA 例子 #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include "platform/android/jni/Jni ...