Uva 11694 Gokigen Naname
基本思路是Dfs:
1. 一个一个格子摆放,以每个各自的左上角的点为基准点代表格子,比如(0,0)代表(0,0)(0,1)(1,0)(1,1)组成的格子,(0,1)代表(0,1)(0,2)(1,1),(1,2)组成的格子,以此类推,即可一个一个格子按顺序摆放。
2. 当摆放(x,y)时,比较分别放 \ 和放 / ,同时比较(x,y)的数值要求是否已经达到(不能多不能少,(x,y)必须刚好达到),其次比较另外的如(x+1,y),(x+1,y+1),(x,
y+1)是否已经超出要求。再者就是判断是否构成环,我采用了dfs的方法。
3. 如何表示这个点连接几条斜线了呢?可以用一个数组保存,如point[i][j] 表示(i, j)连接了point[i][j]条斜线。而判断两个点是否连接可以用link[][][][],如link[a][b][c][d],表示link[a][b][c][d]是否连接。
一点收获与感悟:最初写的时候,没有link数组,想用point[a][b]和point[c][d]是否同时大于1判断(a, b)与(c,d)是否连接,结果可想而知,这个错误明显了!发现这个错误后才加入了link数组。但这样只是解决了错误,还没有解决超时。刚开始写的时候只判断了(x,y)是否满足要求,没有判断其它点,后来一想,可能再给(x, y)(x+1, y+1)相连时,(x+1, y+1)连接的边数就超过(x+1, y+1)要求的边数了,所以要同时判断与(x,y)相连的点,这个判断一添,就没有超时了。
- #include <bits/stdc++.h>
- using namespace std;
- const int MAXN = 7 + 3;
- char chess[MAXN][MAXN];
- int point[MAXN][MAXN];
- bool link[MAXN][MAXN][MAXN][MAXN];
- int N;
- int go[4][2] = {1,1, 1,-1, -1,-1, -1,1};
- void Read() {
- for(int i=0; i<N+1; ++ i) {
- for(int j=0; j<N+1; ++ j) {
- cin >> chess[i][j];
- }
- }
- }
- bool vis[MAXN][MAXN];
- bool found;
- void Loop(int x, int y, int a, int b) {
- if(found || x<0 || x>N || y<0 || y>N || !link[x][y][a][b] ) {
- return ;
- }
- if(vis[x][y]) {
- found = true;
- return ;
- }
- vis[x][y] = true;
- for(int i=0; i<4; ++i) {
- if( x+go[i][0]!=a || y+go[i][1]!=b ) {
- Loop(x+go[i][0], y+go[i][1], x, y);
- }
- }
- }
- bool Any(int x, int y) {
- memset(vis, false, sizeof(vis));
- found = false;
- vis[x][y] = true;
- Loop(x+1, y+1, x, y);
- Loop(x-1, y-1, x, y);
- Loop(x-1, y+1, x, y);
- Loop(x+1, y-1, x, y);
- return !found;
- }
- bool Dfs(int r, int c) {
- if(c == N) {
- if( isdigit(chess[r][c]) && point[r][c] != chess[r][c] - '0') {
- return false;
- }
- ++ r; c = 0;
- if(r == N) {
- for(int i=0; i<N+1;i++) {
- if(isdigit(chess[r][i]) && point[r][i] != chess[r][i] - '0') {
- return false;
- }
- }
- return true;
- } else {
- return Dfs(r, c);
- }
- }
- int x = r, y = c;
- point[x][y] ++;
- point[x+1][y+1] ++;
- link[x][y][x+1][y+1] = true;
- link[x+1][y+1][x][y] = true;
- if( isdigit(chess[x][y]) && point[x][y] != chess[x][y] - '0') {
- ;
- } else if(isdigit(chess[x+1][y+1]) && point[x+1][y+1] > chess[x+1][y+1] - '0') {
- ;
- } else if(Any(x, y)) {
- ++ y;
- if(Dfs(x, y)) {
- return true;
- }
- }
- x = r, y =c;
- link[x][y][x+1][y+1] = false;
- link[x+1][y+1][x][y] = false;
- point[x][y] --;
- point[x+1][y+1] --;
- point[x][y+1] ++;
- point[x+1][y] ++;
- link[x][y+1][x+1][y] = true;
- link[x+1][y][x][y+1] = true;
- if( isdigit(chess[x][y]) && point[x][y] != chess[x][y] - '0') {
- ;
- } else if(isdigit(chess[x][y+1]) && point[x][y+1] > chess[x][y+1] - '0') {
- ;
- } else if(isdigit(chess[x+1][y]) && point[x+1][y] > chess[x+1][y] - '0') {
- ;
- } else if(Any(x, y+1)) {
- ++ y;
- if(Dfs(x, y)) {
- return true;
- }
- }
- x = r, y =c;
- link[x][y+1][x+1][y] = false;
- link[x+1][y][x][y+1] = false;
- point[x][y+1] --;
- point[x+1][y] --;
- return false;
- }
- void Work() {
- memset(point, 0, sizeof(point));
- memset(link, false, sizeof(link));
- Dfs(0 ,0);
- }
- void Print() {
- for(int i=0; i<N; ++i) {
- for(int j=0; j<N; ++j) {
- if(point[i][j] && point[i+1][j+1] && link[i][j][i+1][j+1]) {
- cout << "\\";
- } else {
- cout << "/";
- }
- }
- cout << endl;
- }
- }
- int main() {
- ios::sync_with_stdio(false);
- cin.tie(0);
- int T;
- cin >> T;
- while(T --) {
- cin >> N;
- Read();
- Work();
- Print();
- }
- return 0;
- }
Uva 11694 Gokigen Naname的更多相关文章
- UVA11694 Gokigen Naname题解
目录 写在前面 Solution Code 写在前面 UVA的题需要自己读入一个 \(T\) 组数据,别被样例给迷惑了 Solution 每个格子只有两种填法且 \(n \le 7\),暴力搜索两种填 ...
- 题解 UVA11694 【Gokigen Naname谜题 Gokigen Naname】
题目 题解 考场上连暴力都不会打的码农题,深搜是真的难 /kk 前置问题 怎么输出"\" cout<<"\\"; 2.怎么处理不在一个环里,可以考虑 ...
- uva 1354 Mobile Computing ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5
- UVA 10564 Paths through the Hourglass[DP 打印]
UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...
- UVA 11404 Palindromic Subsequence[DP LCS 打印]
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...
- UVA&&POJ离散概率与数学期望入门练习[4]
POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...
- UVA计数方法练习[3]
UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...
- UVA数学入门训练Round1[6]
UVA - 11388 GCD LCM 题意:输入g和l,找到a和b,gcd(a,b)=g,lacm(a,b)=l,a<b且a最小 g不能整除l时无解,否则一定g,l最小 #include &l ...
- UVA - 1625 Color Length[序列DP 代价计算技巧]
UVA - 1625 Color Length 白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束 和模拟赛那道环形DP很想,计算这 ...
随机推荐
- Android 架构【转】
import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app ...
- Swift 中类的初始化器与继承
首先,Swift 为类定义了两种初始化器来确保类中所有的储存属性都能得到一个初始化值.这两种初始化器就是「指定初始化器」(Designated Initializer)与「便利初始化器」(Conven ...
- 如何在windows server 2012 R2 部署WEB项目
tip: 今天发布项目到windows server 2012 R2上面. 没有接触过,其实很简单,看图: 这是安装IIS成功后显示的总图: 二.点击Manage ,选择Add Roles and F ...
- vs2010 项目编译 ResGen.exe”已退出,代码为 -1073741701
解决的办法如下: 1.关闭所有Visual Studio: 2.以管理员的身份打开命令提示窗口:(开始-运行-cmd) 3.更改目录至"CD C:\Program Files (x86)\M ...
- CSS–Some Structure
Some Structure About CSS Layout Position,Layer[层次] Box Model Visual Formatting Model BFC[block forma ...
- HTML静态网页(图片热点、网页划区、拼接及表单的使用)
图片热点: 规划出图片上的一个区域,可以做出超链接,直接点击图片区域就可以完成跳转的效果. 示例: 网页划区: 在一个网页里,规划出一个区域用来展示另一个网页的内容. 示例: 网页的拼接: 在一个 ...
- iOS实践04
第四天 微博数据展示:获取服务器数据,json数据的解析,MVC的使用,自定义cell高度的计算,一些分类的设计.已经是第四天了,虽然每天都有课程,但这个东西也基本完成了一大半吧,一些忘掉的知识也捡起 ...
- BZOJ 2752: [HAOI2012]高速公路(road)( 线段树 )
对于询问[L, R], 我们直接考虑每个p(L≤p≤R)的贡献,可以得到 然后化简一下得到 这样就可以很方便地用线段树, 维护一个p, p*vp, p*(p+1)*vp就可以了 ----------- ...
- 在VC6中基于dll开发插件用于各种图片显示(BMP/TGA/JPG/GIF/PNG/TIF/ICO/WMF/EMF/...)
一.图片显示 图片显示的方法: 1. 直接写程序 2. 第3方库 3. 调用COM组件的IPicture接口 4. 使用MFC的CPictureHolder类 5. 使用GDI+的CImag ...
- live555学习经验链接一
live555学习经验链接:http://xingyunbaijunwei.blog.163.com/blog/#m=0&t=1&c=fks_084071082087086069082 ...