zoj 3823 Excavator Contest(结构体)
题目链接:zoj 3823 Excavator Contest
题目大意:一个人开着挖掘机要在N*N的格子上面移动。要求走全然部的格子。而且转完次数要至少为n*(n-1) - 1次,
而且终点和起点必须都在边界上。
解题思路:构造。由于终点和起点必须在边界上,进去的同一时候得留出一条路径出来。
- 奇数
- 偶数
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VzaHVhaTE5OTQwNzIy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
奇数的情况分两种(图上两点所代表的正方形构造方式是一样的。即13。9为一类,11。7为一类)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VzaHVhaTE5OTQwNzIy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
偶数分为四类(图上两点所代表的正方形构造方式是不一样的,即14,12,10,8各为一类)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VzaHVhaTE5OTQwNzIy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VzaHVhaTE5OTQwNzIy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
这是我做过最恶心的构造题了。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 550;
const int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
//const int G[5][50] = {{0}, {0}, {3, 4, 2, 1}, {5, 6, 9, 4, 7, 8, 3, 2, 1}};
const int dir_down[4][4][4] = { {{3, 1, 2, 1}, {3, 3, 0, 3}, {1, 3, 0, 3}, {1, 3, 0, 0}},
{{2, 1, 3, 1}, {2, 1, 3, 3}, {0, 3, 1, 3}, {3, 0, 2, 0}},
{{3, 1, 2, 1}, {1, 3, 0, 3}, {1, 3, 0, 0}} };
const int dir_left[5][4] = { {1, 2, 0, 2}, {1, 2, 0, 2}, {2, 1, 3, 1}, {0, 2, 1, 2}, {0, 2, 1, 1}};
const int dir_up[5][4] = { {2, 0, 3, 0}, {2, 0, 3, 0}, {0, 2, 1, 2}, {3, 0, 2, 0}, {3, 0, 2, 2} };
int L, R, g[maxn][maxn];
void put(int n);
inline void jump(int n, int& x, int& y, int& mv, int len, const int d[4]) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < 4; j++) {
g[x][y] = mv;
mv += len;
x += dir[d[j]][0];
y += dir[d[j]][1];
}
}
}
inline void moveup(int n, int& x, int& y, int& mv, int len) {
//printf("moveup:%d\n", len);
if (n&1) {
jump(n / 2 - 1, x, y, mv, len, dir_up[0]);
for (int t = 0; t < 2; t++) {
g[x][y] = mv;
x += dir[2][0];
y += dir[2][1];
mv += len;
}
} else if ((n/2) % 4) {
jump(n / 2 - 2, x, y, mv, len, dir_up[1]);
jump(1, x, y, mv, len, dir_up[2]);
} else {
jump(n / 2 - 2, x, y, mv, len, dir_up[3]);
jump(1, x, y, mv, len, dir_up[4]);
}
}
inline void moveleft(int n, int& x, int& y, int& mv, int len) {
//printf("moveleft:%d\n", len);
if (n&1) {
jump(n / 2, x, y, mv, len, dir_left[0]);
for (int t = 0; t < 2; t++) { // down twice;
g[x][y] = mv;
x += dir[1][0];
y += dir[1][1];
mv += len;
}
} else if ((n/2) % 4) {
jump(n / 2 - 1, x, y, mv, len, dir_left[1]);
jump(1, x, y, mv, len, dir_left[2]);
} else {
jump(n / 2 - 1, x, y, mv, len, dir_left[3]);
jump(1, x, y, mv, len, dir_left[4]);
}
}
inline void movedown(int n, int& x, int& y, int& mv, int len) {
int p;
//printf("movedown!\n");
if (n&1) {
for (int k = 0; k < 4; k++) {
if (k == 0) p = n / 2;
else if (k == 1 || k == 3) p = 1;
else p = n / 2 - 2;
jump(p, x, y, mv, len, dir_down[0][k]);
}
} else if ((n/2) % 4 == 1) {
for (int k = 0; k < 4; k++) {
if (k == 0) p = n / 2 - 1;
else if (k == 1 || k == 3) p = (n == 2 && k == 3 ?
0 : 1);
else p = max(n / 2 - 2, 0);
jump(p, x, y, mv, len, dir_down[1][k]);
}
} else {
for (int k = 0; k < 3; k++) {
if (k == 0 || k == 1) p = n / 2 - 1;
else p = 1;
jump(p, x, y, mv, len, dir_down[2][k]);
}
}
}
void solve (int n, int sx, int sy, int ex, int ey, int flag) {
if (n <= 1) {
if (n == 1)
g[sx][sy] = L;
return;
}
/*
printf("%d:\n", n);
put(10);
*/
if (n&1) {
if ((n/2)&1) {
if (flag) {
moveup(n, sx, sy, L, 1);
moveleft(n, ex, ey, R, -1);
} else {
moveup(n, ex, ey, R, -1);
moveleft(n, sx, sy, L, 1);
}
solve(n - 2, sx, sy, ex, ey, flag);
} else {
if (flag)
movedown(n, ex, ey, R, -1);
else
movedown(n, sx, sy, L, 1);
solve(n - 2, sx, sy, ex, ey, flag^1);
}
} else {
if ((n/2)&1) {
if (flag)
movedown(n, ex, ey, R, -1);
else
movedown(n, sx, sy, L, 1);
solve(n - 2, sx, sy, ex, ey, flag^1);
} else {
if (flag) {
moveup(n, sx, sy, L, 1);
moveleft(n, ex, ey, R, -1);
} else {
moveup(n, ex, ey, R, -1);
moveleft(n, sx, sy, L, 1);
}
solve(n - 2, sx, sy, ex, ey, flag);
}
}
}
void put (int n) {
for (int i = 1; i <= n; i++) {
printf("%d", g[i][1]);
for (int j = 2; j <= n; j++)
printf(" %d", g[i][j]);
printf("\n");
}
}
int main () {
int cas, n;
scanf("%d", &cas);
while (cas--) {
scanf("%d", &n);
int sx, sy, ex, ey, flag;
L = 1, R = n * n;
if (n&1) {
if ((n/2)&1)
ex = 1, ey = sx = sy = n, flag = 1;
else
sx = sy = ex = 1, ey = n, flag = 0;
} else {
int t = n / 2;
t = (t - 1) % 4 + 1;
if (t == 1)
sx = 1, sy = ex = 2, ey = n, flag = 0;
else if (t == 2)
sx = sy = ey = n, ex = 1, flag = 1;
else if (t == 3)
sx = sy = ex = 1, ey = n, flag = 0;
else
sx = ey = n, sy = n - 1, ex = 2, flag = 1;
}
//printf("%d %d %d %d %d!!!\n", sx, sy, ex, ey, flag);
solve(n, sx, sy, ex, ey, flag);
put(n);
}
return 0;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
zoj 3823 Excavator Contest(结构体)的更多相关文章
- zoj 3823 Excavator Contest 构造
Excavator Contest Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/show ...
- HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 初次见识结构体与map的区别
题目 http://vjudge.net/contest/view.action?cid=51142#problem/G 自己做的结构体 #include <iostream>#incl ...
- Go结构体实现类似成员函数机制
Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...
- C#基础回顾(二)—页面值传递、重载与重写、类与结构体、装箱与拆箱
一.前言 -孤独的路上有梦想作伴,乘风破浪- 二.页面值传递 (1)C#各页面之间可以进行数据的交换和传递,页面之间可根据获取的数据,进行各自的操作(跳转.计算等操作).为了实现多种方式的数据传递,C ...
- go语言结构体
定义: 是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体. 成员: 每个值称为结构体的成员. 示例: 用结构体的经典案例处理公司的员工信息,每个员工信息包含一个唯一的员工编号.员工的名字. ...
- C语言中的结构体
用户自己建立自己的结构体类型 1. 定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...
- C++_系列自学课程_第_12_课_结构体
#include <iostream> #include <string> using namespace std; struct CDAccount { double bal ...
- java socket传送一个结构体给用C++编写的服务器解析的问题
另一端是Java写客户端程序,两者之间需要通信.c++/c接收和发送的都是结构体,而Java是直接发送的字节流或者byte 数组.解决方法:c++/c socket 在发送结构体的时候其实发送的也是字 ...
随机推荐
- 央视公然诽谤Linux操作系统,谁报告?
考虑下面的观点: 这是今年5月111日上午11点04分央视播出的一则新闻,题为"工信部希望用户使用国产操作系统(替代XP). 该新闻报道,概念混乱,违背事实,误导公众,谁来举报?现举一例加以 ...
- 利用Pattern和Mather来禁止特殊字符的输入
String regEx="[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}[]‘::”“’.,.?]&q ...
- Kafka设计
[Apache Kafka]Kafka设计 在开始开发producer和consumer之前,先从设计的角度看一看Kafka. 由于重度依赖JMS,且实现方式各异.对可伸缩架构的支持不够,Link ...
- ./startup.sh: Permission denied
今天在Linux上部署项目,之前报过这个错误,通过下面方式攻克了.如今发出来备份一下: LINUX权限-bash: ./startup.sh: Permission denied 运行./startu ...
- 解决visual studio空格变成很多点号的3种方法
在用visual studio做网站时不知道按了什么快捷键,所有页面上的空格都变成了点号,就像下图那样. 要解决空格变点号的方法有两种:1.编辑->高级->查看空白2.Ctrl+E 然后按 ...
- mvc+webapi+dapper+ef codefirst项目搭建
首先项目是mvc5+webapi2.0+orm数据处理(dapper)+ef动态创建数据库. 1.项目框架层次结构: mvc项目根据不同的业务和功能进行不同的区域划分[今后项目维护起来方便],mode ...
- Linux X86在下面TLB机制
TLB - translation lookaside buffer 快表.直译为翻译后备缓冲器,也能够理解为页表缓冲.地址变换快速缓存. 因为页表存放在主存中,因此程序每次訪存至少须要两次:一次訪存 ...
- can't connect to mysql server on localhost <10061>
需要启动MySQL服务.它可以通过两种方式来启动使用MySQL: 1.命令行模式. Win+R,进入cmd然后按Enter键.在命令行形式的输入: net start mysql56 mysql56是 ...
- Xcode_6.3_beta_4 官方 下载地址
http://adcdownload.apple.com//Developer_Tools/Xcode_6.3_beta_4/Xcode_6.3_beta_4.dmg
- 【Android进阶】Activity的四种加载模式
Activity的四种加载模式: 1.standard :系统的默认模式,一次跳转即会生成一个新的实例.假设有一个activity命名为Act1, 执行语句:startActivity(new Int ...