109. Magic of David Copperfield II

time limit per test: 0.25 sec. 
memory limit per test: 4096 KB

The well-known magician David Copperfield loves lo show the following trick: a square with N rows and N columns of different pictures appears on a TV screen, Let us number all the pictures in the following order:

1 2 ... N
... ... ... ...
N*(N-1)+1 N*(N-1)+2 ... N*N

Each member of the audience is asked to put a finger on the upper left picture (i.e., picture number one) and The Magic begins: the magician tells the audience to move the finger K1 times through the pictures (each move is a shift of the finger to the adjacent picture up, down, left or right provided that there is a picture to move to), then with a slight movement of his hand he removes some of the pictures with an exclamation "You are not there!", and ... it is true - your finger is not pointing to any of the pictures removed. Then again, he tells the audience to make K2 moves, and so on. At the end he removes all the pictures but one and smiling triumphantly declares, "I've caught you" (applause).

Just now, David is trying to repeat this trick. Unfortunately, he had-a hard day before, and you know how hard to conjure with a headache. You have to write a program that will help David to make his trick.

Input

The input file contains a single integer number N (1<N<101).

Output

Your program should write the following lines with numbers to the output file:
K1 X1,1 X1,2 ... X1,m1
K2 X2,1 X2,2 ... X2,m2
...
Ke Xe,1 Xe,2 ... Xe,me
where Ki is a number of moves the audience should make on the i-th turn (N<=Ki<300). All Ki, should be different (i.e. Ki<>Kj when i<>j). Xi,1 Xi,2 ... Xi,mi are the numbers of the pictures David should remove after the audience will make Ki moves (the number of the pictures removed is arbitrary, but each picture should be listed only once, and at least one picture should be removed on each turn).
A description of the every next turn should begin with a new line. All numbers on each line should be separated by one or more spaces. After e iterations, all pictures except one should be removed.

Sample Input

3

Sample Output

3 1 3 7 9
5 2 4 6 8 一开始被题意吓住了,但是画一画就能发现,
只要是奇数步,就不能停留在原位,要是把整个迷宫划分成国际棋盘的黑白格,那么奇数步必然只能转移到异色格上,
注意到这点而且题目是special judge ,只需注意随时保持还没被染色的在一块大联通域里面就行了,(要是被孤立了那么玩家就不能再走,魔术师就算是没有完成魔术,要是多个区块就不知道玩家到底在哪个区块了,这样无法消除到只有一个含一块的区块)
这里为了保证这一点我使用的是从外向里,每次推一层的方法,假设出发点(0,0)是白格(计算中使用了二维坐标,结果转化为i*n+j+1)
对于里面的第i层,先消去上一层i-1层未涂色的白格,再消去i层可以消去的白格(相邻的黑格都有两个及以上个没有被消去的白格相邻),最后新建一个操作,消去i层的所有黑格(这时候i层的白格不会受影响,因为还有i+1层)

大致染色过程如图
因为染色操作最多有(n/2)*2,开头使用n也不会超出300的操作数
W原因:没有注意到ki<300
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=102;
const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
bool vis[maxn][maxn];
int n;
int heap1[maxn*maxn],len1,heap2[maxn*maxn],len2,heapt[maxn*maxn],lent;//heap1 第i圈可以消去的白 heap2 第i-1圈没有消掉的白 heapt 第i圈的第二个操作消去的黑格
bool oneentry(int x,int y){//只有一个出口
int fl=0;
for(int i=0;i<4;i++){
int tx=x+dx[i],ty=y+dy[i];
if(tx>=0&&tx<n&&ty>=0&&ty<n&&!vis[tx][ty]){
fl++;
}
}
return fl<=1;
}
bool avail(int x,int y){//是否会抓住顾客
for(int i=0;i<4;i++){
int tx=x+dx[i],ty=y+dy[i];
if(tx>=0&&tx<n&&ty>=0&&ty<n&&!vis[tx][ty]){
if(oneentry(tx,ty))return false;
}
}
return true;
}
int main(){
while(scanf("%d",&n)==1){
memset(vis,0,sizeof(vis));
len1=len2=lent=0;
int num=n&1?n:n+1;
for(int i=0;i<n/2;i++){
printf("%d ",num);num+=2;
for(int k=0;k<len2;k++)printf("%d ",heap2[k]);//上层未涂色白格
len1=len2=lent=0;
int x=i,y=i;
for(int dr=0;dr<4;dr++){
for(int j=0;j<n-2*i-1;j++){
if((x+y)&1){heapt[lent++]=x*n+y+1;vis[x][y]=true;}//黑格
else if(avail(x,y)){heap1[len1++]=x*n+y+1;vis[x][y]=true;}//暂时不能选的白格
else {heap2[len2++]=x*n+y+1;vis[x][y]=true;}//可选择白格
x+=dx[dr];
y+=dy[dr];
}
}
for(int k=0;k<len1;k++){
printf("%d%c",heap1[k],k==len1-1?'\n':' ');//涂白格
}
printf("%d ",num);num+=2;
for(int k=0;k<lent;k++)printf("%d%c",heapt[k],k==lent-1?'\n':' ');//涂黑格
}
}
return 0;
}

  


109. Magic of David Copperfield II 构造 难度:2的更多相关文章

  1. 构造 - SGU 109 Magic of David Copperfield II

    Magic of David Copperfield II Problem's Link Mean: 略 analyse: 若i+j为奇数则称(i,j)为奇格,否则称(i+j)为偶格,显然每一次报数后 ...

  2. sgu 109 Magic of David Copperfield II

    这个题意一开始没弄明白,后来看的题解才知道这道题是怎么回事,这道题要是自己想难度很大…… 你一开始位于(1,1)这个点,你可以走k步,n <= k < 300,由于你是随机的走的, 所以你 ...

  3. Magic of David Copperfield II(奇偶性)

    题目大意:这是一个魔术游戏,首先把你的手指放在一个左上角的格子里面,然后魔术师说你可以移动K1步,移动完之后,他会删除一些方格,并且说,你肯定不在这里,删除的方格不可以再去了,然后让你再走K2步,继续 ...

  4. UVa LA 4094 WonderTeam 构造 难度: 1

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  5. BZOJ3098: Hash Killer II(构造)

    Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 2162  Solved: 1140[Submit][Status][ ...

  6. Codeforces 346C Number Transformation II 构造

    题目链接:点击打开链接 = = 990+ms卡过 #include<stdio.h> #include<iostream> #include<string.h> # ...

  7. POJ 3295 Tautology 构造 难度:1

    Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9580   Accepted: 3640 Descrip ...

  8. SGU 138. Games of Chess 构造 难度:2

    138. Games of Chess time limit per test: 0.25 sec. memory limit per test: 4096 KB N friends gathered ...

  9. sgu 137. Funny Strings 线性同余,数论,构造 难度:3

    137. Funny Strings time limit per test: 0.25 sec. memory limit per test: 4096 KB Let's consider a st ...

随机推荐

  1. JavaScript常用操作,常用类

    算术运算符 重点关注 算数,赋值,逻辑运算符,三目运算符 <!DOCTYPE html> <html> <head> <meta charset=" ...

  2. 详解C中的volatile关键字【转】

    本文转载自:http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html volatile提醒编译器它后面所定义的变量随时都有 ...

  3. 记录openwrt下补丁apply的过程中出错,但是可以单独打上该补丁

    背景: 在openwrt的编译框架下无法正确打上补丁,而单独使用git却可以成功 这个补丁到底与其它补丁有何不同? 该补丁的生成的过程解析: 旧文件:vi 打开旧文件会提示no newline at ...

  4. 分布式事务之——tcc-transaction分布式TCC型事务框架搭建与实战案例(基于Dubbo/Dubbox)

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/73731363 一.背景 有一定分布式开发经验的朋友都知道,产品/项目/系统最初为了 ...

  5. iBatis的基本配置+CRUD操作

    首先解释一下CRUD的含义:CRUD是指在做计算处理时的增加(Create).查询(Retrieve)(重新得到数据).更新(Update)和删除(Delete) 基本的数据库操作 创建工程iBati ...

  6. go语言 变量类型

    package main import "fmt" func main() { //这是我们使用range去求一个slice的和.使用数组跟这个很类似.创建数组 nums := [ ...

  7. python ros 关闭节点

    def myhook(): print "shutdown time!" rospy.on_shutdown(myhook) 或 rospy.signal_shutdown(rea ...

  8. Django 综合篇

    前面,已经将Django最主要的五大系统介绍完毕,除了这些主要章节,还有很多比较重要的内容,比如开发流程相关.安全.本地化与国际化.常见工具和一些框架核心功能.这些内容的篇幅都不大,但整合起来也是Dj ...

  9. 微信小程序 - 简述

    1.小程序理解 基于微信的 免安装 MVVM 应用 编码使用 ES 6 一个页面基本组成:wxml wxss js ( html.css.js ) 2. 常见用法 ( 基本就是跟着例子走.. ) 设置 ...

  10. 解决Resource doesn't have a corresponding Go package.问题

    首先上图 这个报错主要是程序要启动没有入口的原因,package main下边的mian方法才是一个程序的入口.这就要 修改目录结构如下图修改并运行就可以了