大模拟:枚举6个方向。检查每一个0是否能移动

Puzzle


Time Limit: 2 Seconds      Memory Limit: 65536 KB


Little Georgie likes puzzles very much. Recently he has found a wooden triangle in the box with old toys. The side of the triangle is n inches long. The triangle is divided into n2unit
triangles with lines drawn on his surface.

The interesting fact about that triangle is that it is not solid - it consists of two parts. Each of the parts is a connected set of unit triangles. Georgie has put his triangle onto
the table and now wonders whether he can separate the parts. He wants to separate them without taking any part of the triangle off the table, just moving the parts by the table surface. The triangle has a small but non-zero thickness, so while being moved
the parts must not intersect.

For example, if the triangle is divided into parts as it is shown on the top picture below, Georgie can separate the parts the way he wants. However in the case displayed on the bottom
picture, he cannot separate the parts without lifting one of them.

Help Georgie to determine whether he can separate the parts moving them by the surface of the table.

<img src="http://acm.zju.edu.cn/onlinejudge/showImage.do?name=0000%2F2610%2Fg.gif" <="" img=""> <img src="http://acm.zju.edu.cn/onlinejudge/showImage.do?name=0000%2F2610%2Fg2.gif" <="" img="">

Two puzzles corresponding the samples

Input

Input file contains one or more testcases. The first line of each testcase contains n (2 <= n <= 50). Next n lines contain the description of the triangle, i-th of these lines contains
2i - 1 characters, describing unit triangles in the i-th row, from left to right. Character '0' means that the triangle belongs to the first part of the main triangle, '1' means that it belongs to the second one.

Testcase with n = 0 designates the end of the test data, this testcase must not be processed. There is no blank line in the input file.

Output

For each puzzle output the line with its number followed by the line that states whether the parts can be separated. Do not output any blank lines.

Sample Input

6
0
001
00011
0000011
000111111
00111111111
6
0
001
00111
0011011
000000111
00111111111
0

Sample Output

Puzzle 1
Parts can be separated
Puzzle 2
Parts cannot be separated

Author: Andrew Stankevich

Source: Andrew Stankevich's Contest #7

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm> using namespace std; int n;
int tu[55][200]; bool inmap(int x,int y)
{
if((x>=1&&x<=n)&&(y>=1&&y<=2*x-1)) return true;
return false;
} bool check_down(int x,int y,int c,int kind)
{
if(kind==1)
{
/// x+1 --- y,y+1,y+2
/// x+2 --- y+1,y+2,y+3
for(int i=0;i<3;i++)
{
int nx=x+1,ny=y+i;
if(inmap(nx,ny))
{
if(tu[nx][ny]!=c) return false;
}
}
for(int i=1;i<4;i++)
{
int nx=x+2,ny=y+i;
if(inmap(nx,ny))
{
if(tu[nx][ny]!=c) return false;
}
}
}
else if(kind==0)
{
/// x --- y-1 y+1
/// x+1 --- y+1 y+2 y+3
/// x+2 -- y+2 for(int i=-1;i<=1;i++)
{
int nx=x,ny=y+i;
if(inmap(nx,ny))
{
if(tu[nx][ny]!=c) return false;
}
} for(int i=1;i<=3;i++)
{
int nx=x+1,ny=y+i;
if(inmap(nx,ny))
{
if(tu[nx][ny]!=c) return false;
}
} if(inmap(x+2,y+2))
{
if(tu[x+2][y+2]!=c) return false;
}
} return true;
} bool check_left(int x,int y,int c,int kind)
{
if(kind==1)
{
/// x -- y-1 y-2 y-3
/// x-1 y-2,y-3,y-4 for(int i=1;i<=3;i++)
{
int nx=x,ny=y-i;
if(inmap(nx,ny))
{
if(tu[nx][ny]!=c) return false;
}
} for(int i=2;i<=4;i++)
{
int nx=x-1,ny=y-i;
if(inmap(nx,ny))
{
if(tu[nx][ny]!=c) return false;
}
}
}
else if(kind==0)
{
/// x -- y-1 y-2
/// x-1 -- y-1 y-2 y-3 y-4 for(int i=1;i<=2;i++)
{
int nx=x,ny=y-i;
if(inmap(nx,ny))
{
if(tu[nx][ny]!=c) return false;
}
} for(int i=1;i<=4;i++)
{
int nx=x-1,ny=y-i;
if(inmap(nx,ny))
{
if(tu[nx][ny]!=c) return false;
}
}
} return true;
} bool check_right(int x,int y,int c,int kind)
{
if(kind==1)
{
/// x -- y+1 y+2 y+3
/// x-1 y y+1 y+2 y+3 for(int i=1;i<=3;i++)
{
int nx=x,ny=y+i;
if(inmap(nx,ny))
{
if(tu[nx][ny]!=c) return false;
}
} for(int i=0;i<=3;i++)
{
int nx=x-1,ny=y+i;
if(inmap(nx,ny))
{
if(tu[nx][ny]!=c) return false;
}
} }
else if(kind==0)
{
/// x y+1 y+2
/// x-1 y-1 ... y+3
for(int i=1;i<=2;i++)
{
int nx=x,ny=y+i;
if(inmap(nx,ny))
{
if(tu[nx][ny]!=c) return false;
}
}
for(int i=-1;i<=3;i++)
{
int nx=x-1,ny=y+i;
if(inmap(nx,ny))
{
if(tu[nx][ny]!=c) return false;
}
}
}
return true;
} bool check_heng()
{
bool flag=true;
for(int i=1;i<=n&&flag;i++)
{
for(int j=1;j<=2*i-1&&flag;j++)
{
if(tu[i][j]==0)
{
if(inmap(i,j-1)==false) continue;
if(tu[i][j-1]==0) continue;
else flag=false;
}
}
}
if(flag) return true;
flag=true;
for(int i=1;i<=n&&flag;i++)
{
for(int j=1;j<=2*i-1&&flag;j++)
{
if(tu[i][j]==0)
{
if(inmap(i,j+1)==false) continue;
if(tu[i][j+1]==0) continue;
else flag=false;
}
}
}
if(flag) return true;
return false;
} bool check_shu()
{
bool flag=true;
for(int i=1;i<=n&&flag;i++)
{
for(int j=1;j<=2*i-1&&flag;j++)
{
if(tu[i][j]==0)
{
if(j%2==1)
{
int nx=i, ny=j+1;
if(inmap(nx,ny)==false) continue;
if(tu[nx][ny]==0) ;
else flag=false;
}
else if(j%2==0)
{
int nx=i-1, ny=j-1;
if(inmap(nx,ny)==false) continue;
if(tu[nx][ny]==0) ;
else flag=false;
}
}
}
}
if(flag) return true;
flag=true;
for(int i=1;i<=n&&flag;i++)
{
for(int j=1;j<=2*i-1&&flag;j++)
{
if(tu[i][j]==0)
{
if(j%2==1)
{
int nx=i+1, ny=j+1;
if(inmap(nx,ny)==false) continue;
if(tu[nx][ny]==0) ;
else flag=false;
}
else if(j%2==0)
{
int nx=i, ny=j-1;
if(inmap(nx,ny)==false) continue;
if(tu[nx][ny]==0) ;
else flag=false;
}
}
}
}
if(flag) return true;
return false;
} bool check_xie()
{
bool flag=true;
for(int i=1;i<=n&&flag;i++)
{
for(int j=1;j<=2*i-1&&flag;j++)
{
if(tu[i][j]==0)
{
if(j%2==1)
{
int nx=i, ny=j-1;
if(inmap(nx,ny)==false) continue;
if(tu[nx][ny]==0) ;
else
{
flag=false;
}
}
else if(j%2==0)
{
int nx=i-1, ny=j-1;
if(inmap(nx,ny)==false) continue;
if(tu[nx][ny]==0) ;
else
{
flag=false;
}
}
}
}
}
if(flag) return true;
flag=true;
for(int i=1;i<=n&&flag;i++)
{
for(int j=1;j<=2*i-1&&flag;j++)
{
if(tu[i][j]==0)
{
if(j%2==1)
{
int nx=i+1, ny=j+1;
if(inmap(nx,ny)==false) continue;
if(tu[nx][ny]==0) ;
else
{
flag=false;
}
}
else if(j%2==0)
{
int nx=i, ny=j+1;
if(inmap(nx,ny)==false) continue;
if(tu[nx][ny]==0) ;
else
{
flag=false;
}
}
}
}
}
if(flag) return true;
return false;
} char hang[5000]; int main()
{
int cas=1;
while(scanf("%d",&n)!=EOF&&n)
{
printf("Puzzle %d\n",cas++);
int zero=0,one=0;
for(int i=1;i<=n;i++)
{
scanf("%s",hang+1);
for(int j=1;j<=2*i-1;j++)
{
tu[i][j]=hang[j]-'0';
if(tu[i][j]==0) zero++;
else one++;
}
} if(one==0||zero==0)
{
puts("Parts cannot be separated"); continue;
} bool flag=true; if(check_heng()||check_shu()||check_xie()){puts("Parts can be separated"); continue;} for(int i=1;i<=n&&flag;i++)
{
for(int j=1;j<=2*i-1&&flag;j++)
{
if(tu[i][j]!=0) continue;
if(check_down(i,j,0,j%2)) continue;
else flag=false;
}
} if(flag==true)
{
puts("Parts can be separated"); continue;
} flag=true;
for(int i=1;i<=n&&flag;i++)
{
for(int j=1;j<=2*i-1&&flag;j++)
{
if(tu[i][j]!=0) continue;
if(check_left(i,j,0,j%2)) continue;
else flag=false;
}
} if(flag==true)
{
puts("Parts can be separated"); continue;
} flag=true;
for(int i=1;i<=n&&flag;i++)
{
for(int j=1;j<=2*i-1&&flag;j++)
{
if(tu[i][j]!=0) continue;
if(check_right(i,j,0,j%2)) continue;
else flag=false;
}
} if(flag==true)
{
puts("Parts can be separated"); continue;
}
else
{
puts("Parts cannot be separated");
} }
return 0;
}

ZOJ 2610 Puzzle 模拟的更多相关文章

  1. A - Jugs ZOJ - 1005 (模拟)

    题目链接:https://cn.vjudge.net/contest/281037#problem/A 题目大意:给你a,b,n.a代表第一个杯子的容量,b代表第二个杯子的容量,然后一共有6种操作.让 ...

  2. Capture the Flag ZOJ - 3879(模拟题)

    In computer security, Capture the Flag (CTF) is a computer security competition. CTF contests are us ...

  3. ZOJ 3019 Puzzle

    解题思路:给出两个数列an,bn,其中an,bn中元素的顺序可以任意改变,求an,bn的LCS 因为数列中的元素可以按任意顺序排列,所以只需要求出an,bn中的元素有多少个是相同的即可. 反思:一开始 ...

  4. ZOJ 3705 Applications 模拟

    #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include< ...

  5. ZOJ 3652 Maze 模拟,bfs,读题 难度:2

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4842 要注意题目中两点: 1.在踏入妖怪控制的区域那一刹那,先减行动力,然后才 ...

  6. [ZOJ 1009] Enigma (模拟)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1009 题目大意:给你三个转换轮,只有当第一个转换轮转动一圈后第二 ...

  7. ZOJ 1122 Clock(模拟)

    Clock Time Limit: 2 Seconds      Memory Limit: 65536 KB You are given a standard 12-hour clock with ...

  8. 2018 German Collegiate Programming Contest (GCPC 18)

    2018 German Collegiate Programming Contest (GCPC 18) Attack on Alpha-Zet 建树,求lca 代码: #include <al ...

  9. BFS+模拟 ZOJ 3865 Superbot

    题目传送门 /* BFS+模拟:dp[i][j][p] 表示走到i,j,方向为p的步数为多少: BFS分4种情况入队,最后在终点4个方向寻找最小值:) */ #include <cstdio&g ...

随机推荐

  1. 【GISER&&Painter】Chapter02:WebGL中的模型视图变换

    上一节我们提到了如何在一张画布上画一个简单几何图形,通过创建画布,获取WebGLRendering上下文,创建一个简单的着色器,然后将一些顶点数据绑定到gl的Buffer中,最后通过绑定buffer数 ...

  2. 将matlab的figure保存为pdf,避免图片太大缺失

    有时画的matlab图太大,或者有太多的子图,导致图太宽,如果直接保存成pdf的话,会导致左右边丢失,显示不下.一个有效又简单的办法是:   1.在matlab figure里面,Edit -> ...

  3. create xml file from sql script

    Declare @xmlDoc xmlSET @xmlDoc = (SELECT * FROM USERS AS UserTable For XML AUTO, ELEMENTS, ROOT('Roo ...

  4. 自定义ImageView 手势 缩放 滑动 矩阵

    功能 初始时大小控制,图片宽或高大于view的,缩小至view大小,否则按原始大小显示双击放大,第一次双击后将图片宽或高放大到view的宽或高的比例再次双击会再在此前基础上放大固定的倍数放大两次后后再 ...

  5. 这两天对OKR简单总结

    依据两天的学习对OKR进行一个总结. 1.OKR的本质是目标管理. 公司制定公司的战略目标,须要全体员工都可以聚焦到这个目标上来而且形成最大的合力. 公司制定公司层面的OKR.然后员工依据公司的目标. ...

  6. java常用公共代码二之分页代码的实现

    在项目中,我们经常会写到一些公共的代码,来让开发人员调用,减少代码重复,下面,我就将一些常用到的公共类贴出来和大家分享!! 二.分页代码实现:在项目中,分页是一个项目中必不可少的,它可以防止我们从数据 ...

  7. 换掉Tomcat默认图标

    将<Tomcat_home>下的/webapps/ROOT的favicon.ico替换成你自己的图标,名还得是这个名. 然后清除浏览器缓冲,webapp默认的小猫图标就被换掉了. 效果如下 ...

  8. 使用Loader实时查询本地数据库用法

    在看Android的文档时,看到了这么一个东西: Loader 究竟是什么东西呢? Introduced in Android 3.0, loaders make it easy to asynchr ...

  9. 【转】DNS查询过程

    DNS查询过程 DNS的查询过程是指在客户端通过DNS服务器将一个IP地址转换为一个FQDN(Fully Qualified Domain Name,完全合格的域名),或将一个FQDN转化为一个IP地 ...

  10. oracle 三表关联查询

      oracle 三表关联查询 CreationTime--2018年7月4日17点52分 Author:Marydon 左连接实现三表关联 表A--------------------------- ...