zoj1008:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1008

题目意思是有一个游戏,即给出一个图,该图是由n*n个小正方形组成,每个小正方形又由4个三角形组成,要求用这n*n个小正方形拼成一个图,该图的每个小正方形的相邻的三角形的中间的数是相同的

题解:dfs从左到右边,从上到下,一个一个放,并且进行判断,是否合理,如果合理就放置,反之则回溯。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdio>
  5. using namespace std;
  6. int map[][]; //记录不同行的四个三角形
  7. int n,cur; //行数和当前的种类数(也就是有多少个不同行)
  8. int result[]; //记录已经放置的方块的
  9. int counts[]; //记录每一种木块的个数
  10. bool dfs(int num,int n){
  11. if(num==n*n)return ;//找到了就爱返回true
  12. for(int i=;i<cur;i++){//遍历每一种方块注意这里是0~~cur-1;
  13. if(!counts[i]) continue; //如果当前种类的方块数的数目为零,则跳过
  14. if(num%n!=){//注意这里是处理第一列的情形:因为对于第一列,没有更左边的方块需要判断,
  15. //所以没一行的第一个不需要与左边的方块进行判断,直接跳过,这里乜嘢可以改成几个if作为判断语句
  16. if(map[i][]!=map[result[num-]][]) //把当前的种类的方块与上一个进行计较,因为这里的上一个一定是当前左边的额
  17. continue;
  18. }
  19. if(num/n!=){//这里是处理第一行的情形,因为第一行的方块不需要与上一行进行比较,0——n-1的木块都不需要判断
  20. if(map[i][]!=map[result[num-n]][])
  21. continue;
  22. }
  23. result[num]=i; //记录本次的可行的木块种类
  24. counts[i]--; //可行则该种类的木块数目减一
  25. if(dfs(num+,n))//继续放第num+1块,
  26. return ;
  27. else
  28. counts[i]++;//如果没有找到要恢复现场,这里很重要
  29. }
  30. return ;
  31. }
  32. int main(){
  33. int ab=;
  34. int t=;
  35. while(scanf("%d",&n)&&n){
  36. if(ab)
  37. printf("\n");
  38. ab=;
  39. cur=;
  40. memset(map,,sizeof(map));
  41. memset(counts,,sizeof(counts)) ; //注意这里的清空处理
  42. int a,b,c,d;
  43. for(int i=;i<n*n;i++){
  44. bool flag=true;
  45. scanf("%d%d%d%d",&a,&b,&c,&d);
  46. for(int j=;j<cur;j++){
  47. if(map[j][]==a&&map[j][]==b&&map[j][]==c&&map[j][]==d)
  48. {
  49. counts[j]++;
  50. flag=false;
  51. break;
  52. }
  53. } //统计相同的木块数目
  54. if(flag){
  55. map[cur][]=a;
  56. map[cur][]=b;
  57. map[cur][]=c;
  58. map[cur][]=d;
  59. counts[cur]++;
  60. cur++;
  61. }
  62. }
  63. if(dfs(,n)) //注意这里是从0开始的,因为你储存map的时候的下标是从0开始的
  64. printf("Game %d: Possible\n",t++);
  65. else
  66. printf("Game %d: Impossible\n",t++);
  67.  
  68. }
  69.  
  70. }

Gnome Tetravex的更多相关文章

  1. ZOJ 1008 Gnome Tetravex(DFS)

    Gnome Tetravex Time Limit: 10 Seconds      Memory Limit: 32768 KB Hart is engaged in playing an inte ...

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

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1008 题目大意:给你n*n的矩阵,每个格子里有4个三角形,分别是 ...

  3. ZOJ 1008 Gnome Tetravex(DFS)

    题目链接 题意 : 将n*n个正方形进行排列,需要判断相邻的正方形的相邻三角形上边的数字是不是都相等. 思路 : 只知道是个深搜,一开始不知道怎么搜,后来看了题解才明白,就是说不是自己去搜,而是将给定 ...

  4. 1008 Gnome Tetravex

    练习使用DPS的题,不知道有无别的做法,思路不复杂.形式是统计并且进行数字配对. #include <stdio.h> ][],note[],ans[]; void ini(){ int ...

  5. zoj 1008 Gnome Tetravex

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

  6. ZOJ1008 Gnome Tetravex

    DFS+剪枝~ #include<bits/stdc++.h> using namespace std; ][]; int N; int cnt; ]; ]; unordered_map& ...

  7. POJ题目细究

    acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  102 ...

  8. 【转】POJ百道水题列表

    以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...

  9. 如何保存gnome的linux的 会话?相当于windows下的休眠?

    在关机前, 你进行的所有操作, 的集合, 就叫做你跟 linux系统 机器间的 一次 会话, 一个session. linux 可以 在关机时保存 这些session, 保存这些打开的窗口 和程序. ...

随机推荐

  1. android 08 AndroidManifest.xml

    AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xm ...

  2. mysql优化21条

    今天一个朋友向我咨询怎么去优化 MySQL,我按着思维整理了一下,大概粗的可以分为21个方向. 还有一些细节东西(table cache, 表设计,索引设计,程序端缓存之类的)先不列了,对一个系统,初 ...

  3. Qt数据库sqlite总结

      QSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类封装数据库所有记录QSqlRelationalTableModelQSqlQueryMo ...

  4. 查看pid

    可以使用ps -ef | grep httpd查看PID 然后kill –l PID

  5. 还在用ListView?

    还在用Lisview?RecyclerView都已经出来一年多了! 想必大家多或多或少的接触过或者了解过RecyclerView,为什么没有用起来,原因大概如下? ListView我用的挺好的,为什么 ...

  6. Android layout的横竖屏处理

    一.layout-land和layout-prot的区别与使用 默认情况下,创建的Android项目里只有一个layout文件夹,尽管这样也可以横竖屏切换用,但是某些布局横屏过后闲的格外的丑,如下图 ...

  7. JS计算指定日期是距今的第几周,星期几

    无意中在百度知道上发现这样一个问题,就抽时间见写了一个函数. 首先我们需要明确,既然是指定日期距今的第几周,那么就要知道指定的日期是什么,而且是不能确定的,会根据使用者不同而得到不同的日期,所以我们需 ...

  8. java操作excel常用的两种方式

    Excel是我们平时工作中比较常用的用于存储二维表数据的,JAVA也可以直接对Excel进行操作,在这篇博客中将为大家介绍两种操作Excel的方式,分别为:jxl和poi. 对于两者的区别网上有测试如 ...

  9. C++前置++与后置++的区别与重载

    ++属于单目运算符,前置与后置的实现代码不一样,下面以整数自增为例: // 前置++,返回自增后的值,且返回的是一个左值 int& operator++(){ *this += 1; retu ...

  10. cocos2dx JAVA,C++互相调用函数

    C++调用JAVA 例子 #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include "platform/android/jni/Jni ...