ZOJ 2610 Puzzle 模拟
大模拟:枚举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 模拟的更多相关文章
- A - Jugs ZOJ - 1005 (模拟)
题目链接:https://cn.vjudge.net/contest/281037#problem/A 题目大意:给你a,b,n.a代表第一个杯子的容量,b代表第二个杯子的容量,然后一共有6种操作.让 ...
- Capture the Flag ZOJ - 3879(模拟题)
In computer security, Capture the Flag (CTF) is a computer security competition. CTF contests are us ...
- ZOJ 3019 Puzzle
解题思路:给出两个数列an,bn,其中an,bn中元素的顺序可以任意改变,求an,bn的LCS 因为数列中的元素可以按任意顺序排列,所以只需要求出an,bn中的元素有多少个是相同的即可. 反思:一开始 ...
- ZOJ 3705 Applications 模拟
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include< ...
- ZOJ 3652 Maze 模拟,bfs,读题 难度:2
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4842 要注意题目中两点: 1.在踏入妖怪控制的区域那一刹那,先减行动力,然后才 ...
- [ZOJ 1009] Enigma (模拟)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1009 题目大意:给你三个转换轮,只有当第一个转换轮转动一圈后第二 ...
- ZOJ 1122 Clock(模拟)
Clock Time Limit: 2 Seconds Memory Limit: 65536 KB You are given a standard 12-hour clock with ...
- 2018 German Collegiate Programming Contest (GCPC 18)
2018 German Collegiate Programming Contest (GCPC 18) Attack on Alpha-Zet 建树,求lca 代码: #include <al ...
- BFS+模拟 ZOJ 3865 Superbot
题目传送门 /* BFS+模拟:dp[i][j][p] 表示走到i,j,方向为p的步数为多少: BFS分4种情况入队,最后在终点4个方向寻找最小值:) */ #include <cstdio&g ...
随机推荐
- Net设计模式实例之观察者模式
一.观察者模式简介(Brief Introduction) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化的时,会通知所有观察者对象,使他们能 ...
- 分享开源 Markdown 编辑器 Mditor 的「桌面版」
简单说明 Mditor 最早只有「组件版」,随着「桌面版」的发布,Mditor 目前有两个版本: 可嵌入到任意 Web 应用的 Embed 版本,这是一桌面版的基础,Repo: https://git ...
- Spring核心之IoC——依赖注入
在J2EE开发平台中,Spring是一种优秀的轻量级企业应用解决方案.Spring倡导一切从实际出发,它的核心技术就是IOC(控制反转)和AOP(面向切面编程)技术.本文用的Spring版本为spri ...
- Qt 维护工具MaintenanceTool.exe 使用
QT如何管理组件(解决“要继续此操作,至少需要一个有效且已启用的储存库”问题) 转载2017-10-26 01:48:46 标签:qt QT的组件管理软件并没有在开始菜单或者桌面添加快捷方式(5.9版 ...
- 利用FPGA实现PCI总线接口及Windows驱动实现
利用FPGA实现PCI总线接口及Windows驱动实现 关于PCI总线协议,资料网上.书本都是.这里我们仅仅对重点对利用FPGA实现PCI总线接口问题进行简单分析.下图是PCI总线接口信号: 配置空间 ...
- 13个 ASP.NET MVC 的扩展
ASP.NET MVC设计的主要原则之一是可扩展性.处理管线(processing pipeline)上的所有(或大多数)东西都是可替换的.因此,如果您不喜欢ASP.NET MVC所使用的约定(或缺乏 ...
- 模拟jQuery中的ready方法及实现按需加载css,js实例代码
这篇文章介绍了模拟jQuery中的ready方法及实现按需加载css,js实例代码,有需要的朋友可以参考一下 一.ready函数的实现经常用jQuery类库或其他类库中的ready方法,有时候 ...
- delegate和event的区别 (zz)
一. delegate C#代理实际上类似于C++中的函数指针,因为C#中不存在指针,所以用代理可以完成一些原来在C++中用函数指针完成的操作,例如传递一个类A的方法m给另一个类B的对象,使得类B的对 ...
- css背景颜色渐变
1.效果 2.代码 /* 基本色 */ background: #3FB0AC; /* chrome 2+, safari 4+; multiple color stops */ background ...
- apache服务器多端口支持
本示例支持80,82两端口 修改conf/httpd.conf文件: Listen 改为 Listen Listen # Virtual hosts #Include conf/extra/httpd ...