ACM-ZOJ 1008 DFS 一道好题
来源:互联网 发布:java上传文件中文乱码 编辑:程序博客网 时间:2024/05/21 10:18
个人将题目理解为有n*n张卡片操作就像题目那样,也没有出现超时,可能这也不是很暴力吧,但是还是运行了将近6s,不知道排第一的用java写出0ms的和其他用c++写在30ms的是怎么写的。同时最开始我用3维数组存储,好理解但是貌似不是很好写于是还是用的二维,第一维是各个卡片,第二维是没张卡片的上下左右的数。
还有不好理解的就是这深搜的是是否能按题意排列出正确的序列(图样)。
//2012-10-10 17:04:26 Accepted1008C++5760ms188kb#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAX(36);int map[MAX][4]; //存卡片int numOfCard[MAX]; //每种卡片的数量int _right[MAX];//卡片的正确排序int diff; //现在有几种不同的卡片int n;bool DFS(int pos) { if (pos == n*n) return true; int i(0); for ( i = 0; i != diff; ++i) {//i相当于不同种卡片的序号 if (numOfCard[i] == 0) continue; //这种卡片用完了 //如果有前一列,pos%n (0,n,2n,3n...是第一列,除了第一列都有前一列) //前一排的右值!=现在的左值 if (pos%n != 0 && map[ _right[pos - 1] ][1] != map[i][3]) continue; //换卡 //如果有前一行,pos/n (0到n-1是第一行,除了第一行都有前一行) //前一行的下值!=现在的上值 if (pos/n != 0 && map[ _right[pos - n] ][2] != map[i][0]) continue; //换卡 _right[pos] = i; //这个位置应该填该种卡片 --numOfCard[i]; if (DFS(pos + 1)) return true; else ++numOfCard[i]; //DFS返回false后执行恢复现场 } return false;}int main() { int game(1); //进行游戏的次数 while ( scanf("%d", &n) , n) { memset(map, 0, sizeof(map)); memset(numOfCard, 0, sizeof(numOfCard)); memset(_right, 0, sizeof(_right)); diff = 0; int i(0), j(0); int up, down, left, _right; //input for (i = 0; i != n*n; ++i) { scanf("%d%d%d%d", &up, &down, &left, &_right); for (j = 0; j != diff; ++j) //搜索是否是已有卡片 if (up == map[j][0] && down == map[j][1] && left == map[j][2] && _right == map[j][3]) break; if (diff == j){ //如果是新卡片 numOfCard[j] = 1; //新加一种卡片 ++diff; map[j][0] = up; map[j][1] = down; map[j][2] = left; map[j][3] = _right; }else ++numOfCard[j]; //这种卡片的数目加1 } if (game != 1) printf("\n"); printf("Game %d: ", game++); if (DFS(0)) printf("Possible\n"); else printf("Impossible\n"); }}
- ACM-ZOJ 1008 DFS 一道好题
- dfs好题一道
- ACM-ZOJ 2110 DFS
- ZOJ 1204--Additive equations【DFS && 好题】
- dfs——一道好题(抓住剪枝)
- ZOJ-3673-1729【数论】【分解质因数】【DFS】【好题】
- ACM-ZOJ 2412 DFS 深度优先搜索
- 一道好题
- 一道搜索好题
- 一道搜索好题
- zoj 1008 DFS
- ZOJ 1008 (DFS)
- 计蒜客的一道题dfs
- 学校的一道acm题
- 第一道ACM程序题
- zoj 1100&& poj2411 Mondriaan's Dream (dfs&&枚举&&状态压缩dp)好题
- [ACM] ZOJ 3816 Generalized Palindromic Number (DFS,暴力枚举)
- [ACM] ZOJ 3816 Generalized Palindromic Number (DFS,暴力枚举)
- 【枚舉】【STL】 ABCDEF (ABCDEF.c/cpp/pas)
- 如何查看计算机那个端口被占用,以及被那个进程所占用
- KTween引擎各种easing效果线性预览
- C# 静态变量及静态函数
- 现实世界Windows Azure: 排气系统制造商 Akrapovič Revs 运用Windows Azure进行全球运营
- ACM-ZOJ 1008 DFS 一道好题
- ZOJ1195 Blowing Fuses
- 已知二叉树的前序/后序遍历和中序遍历,求后序/前序遍历
- 搬家了
- spring的自动装配(default-autowire="byName")
- C#小结: 通信 观察者模式 ,事件使用
- C++中的1和1L
- 运用Autoconf和Automake生成Makefile的学习之——Powered By eric.dream
- 一枕落花香