例题4-5 追踪电子表格中的单元格(Spreadsheet Tracking,ACM/ICPC World Finals 1997,UVa512)

本文主要是介绍例题4-5 追踪电子表格中的单元格(Spreadsheet Tracking,ACM/ICPC World Finals 1997,UVa512),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原题链接:https://vjudge.net/problem/UVA-512
分类:函数
备注:复杂模拟
前言:理论上这应该是个水题…,但是需要足够的仔细,仔细再仔细!

第一种思路,单点模拟,先说明这确实和作者的原代码没什么差别,我自己的是第二个…
代码如下:

#include<stdio.h>
#include<string.h>
const int maxd = 10000;
int r, c, n, q, r0, c0, kase;
struct Command
{char c[10];int r1, c1, r2, c2;int num, x[20];
}cmd[maxd];
int simulate(int* r0,int* c0)
{for (int i = 0; i < n; i++){if (cmd[i].c[0] == 'E'){if (cmd[i].r1 == *r0 && cmd[i].c1 == *c0) { *r0 = cmd[i].r2; *c0 = cmd[i].c2; }else if (cmd[i].r2 == *r0 && cmd[i].c2 == *c0) { *r0 = cmd[i].r1; *c0 = cmd[i].c1; }}else{int dr = 0, dc = 0;for (int j = 0; j < cmd[i].num; j++){if (cmd[i].c[0] == 'I'){if (cmd[i].c[1] == 'R' && cmd[i].x[j] <= *r0)dr++;if (cmd[i].c[1] == 'C' && cmd[i].x[j] <= *c0)dc++;}else{if (cmd[i].c[1] == 'R' && cmd[i].x[j] == *r0)return 0;if (cmd[i].c[1] == 'C' && cmd[i].x[j] == *c0)return 0;if (cmd[i].c[1] == 'R' && cmd[i].x[j] < *r0)dr--;if (cmd[i].c[1] == 'C' && cmd[i].x[j] < *c0)dc--;}}*r0 += dr; *c0 += dc;}}return 1;
}
int main(void)
{while (scanf("%d%d%d", &r, &c, &n) == 3 && r){for (int i = 0; i < n; i++){scanf("%s", cmd[i].c);if (cmd[i].c[0] == 'E')scanf("%d%d%d%d", &cmd[i].r1, &cmd[i].c1, &cmd[i].r2, &cmd[i].c2);else {scanf("%d", &cmd[i].num);for (int j = 0; j < cmd[i].num; j++)scanf("%d", &cmd[i].x[j]);}}if (kase)printf("\n");printf("Spreadsheet #%d\n", ++kase);scanf("%d", &q);while (q--){scanf("%d%d", &r0, &c0);printf("Cell data in (%d,%d) ", r0, c0);if (simulate(&r0, &c0))printf("moved to (%d,%d)\n", r0, c0);else printf("GONE\n");}}return 0;
}

另一种思路全局模拟:

#include<stdio.h>
#include<stdlib.h>
const int base = 10000;
int r, c, n, q, kase, a[100][100], x[100];
int cmp(const void* a, const void* b)
{return *(int*)a - *(int*)b;
}
void ins(char type, int dis, int x)
{if (type == 'R'){r++;for (int i = r; i >= x + dis + 1; i--)for (int j = 1; j <= c; j++)a[i][j] = a[i - 1][j];for (int j = 1; j <= c; j++)a[x + dis][j] = 0;}else{c++;for (int j = c; j >= x + dis + 1; j--)for (int i = 1; i <= r; i++)a[i][j] = a[i][j - 1];for (int i = 1; i <= r; i++)a[i][x + dis] = 0;}
}
void del(char type, int dis, int x)
{if (type == 'R'){for (int i = x - dis; i < r; i++)for (int j = 1; j <= c; j++)a[i][j] = a[i + 1][j];r--;}else{for (int j = x - dis; j < c; j++)for (int i = 1; i <= r; i++)a[i][j] = a[i][j + 1];c--;}
}
void change()
{char cmd[15];scanf("%s", cmd);if (cmd[0] == 'E'){int x1, y1, x2, y2, tmp;scanf("%d%d%d%d", &x1, &y1, &x2, &y2);tmp = a[x1][y1], a[x1][y1] = a[x2][y2], a[x2][y2] = tmp;}else{int cnt, tmp;scanf("%d", &cnt);for (int i = 0; i < cnt; i++)scanf("%d", &x[i]);qsort(x, cnt, sizeof(int), cmp);if (cmd[0] == 'I')for (int i = 0; i < cnt; i++)ins(cmd[1], i, x[i]);else for (int i = 0; i < cnt; i++)del(cmd[1], i, x[i]);}
}
void find()
{int x, y;scanf("%d%d", &x, &y);for (int i = 1; i <= r; i++)for (int j = 1; j <= c; j++)if (a[i][j] == x * base + y){printf("Cell data in (%d,%d) moved to (%d,%d)\n", x, y, i, j);return;}printf("Cell data in (%d,%d) GONE\n", x, y);
}
int main(void)
{while (scanf("%d%d", &r, &c) == 2 && r){if (kase)printf("\n");printf("Spreadsheet #%d\n", ++kase);for (int i = 1; i <= r; i++)for (int j = 1; j <= c; j++)a[i][j] = i * base + j;scanf("%d", &n);while (n--)change();scanf("%d", &q);while (q--)find();}return 0;
}

这篇关于例题4-5 追踪电子表格中的单元格(Spreadsheet Tracking,ACM/ICPC World Finals 1997,UVa512)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/899051

相关文章

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

SpringBoot如何使用TraceId日志链路追踪

《SpringBoot如何使用TraceId日志链路追踪》文章介绍了如何使用TraceId进行日志链路追踪,通过在日志中添加TraceId关键字,可以将同一次业务调用链上的日志串起来,本文通过实例代码... 目录项目场景:实现步骤1、pom.XML 依赖2、整合logback,打印日志,logback-sp

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

如何在Excel中根据单元格内容作MSnbsp;…

上篇文章,我们介绍了INDEX+SMALL+IF+ROW的数组公式组合,也就是说只要在IF中通过条件的构造,基本上就可以想提取什么条件的数据都可以,数据查询肯定得心应手。 但是,我们一起强调函数公式不是万能的,尤其是数组公式在海量数据面前,既是软肋也是硬伤,而且构造这个函数组合还需要你要具备或者能理解简单数组公式逻辑,对于在函数公式方面没有深究的人,自然是一头雾水。当然,就像“数据透视表”一样,

jqgrid设置单元格可编辑

1 在单元格的属性列设置为editable。 2 点击编辑按钮的时候,触发某一行设置为edit的状态。 jQuery("#rowed4").jqGrid({url:'server.php?q=2',datatype: "json",colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'],colModel

大厂算法例题解之网易2018秋招笔试真题 (未完)

1、字符串碎片 【题目描述】一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,“aaabbaaac” 是由下面碎片组成的:‘aaa’,‘bb’,‘c’。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的 平均长度是多少。 输入描述: 输入包括一个字符串 s,字符串 s 的长度 length(1 ≤ length ≤ 50),s 只含小写字母(‘a’-‘z’) 输出描述

正规式与有限自动机例题

答案:D 知识点: 正规式 正规集 举例 ab 字符串ab构成的集合 {ab} a|b 字符串a,b构成的集合 {a,b} a^* 由0或者多个a构成的字符串集合 {空,a,aa,aaa,aaaa····} (a|b)^* 所有字符a和b构成的串的集合 {空,a,b,ab,aab,aba,aaab····} a(a|b)^* 以a为首字符的a,b字符串的集

【转载】ACM感悟

今天看了一篇我们学校前辈的ACM的感悟,觉得写的十分有道理,这里转载,文章还会不断的改进和更新。 原文链接:http://www.cnblogs.com/Chierush/p/3760870.html?ADUIN=1339764596&ADSESSION=1401536826&ADTAG=CLIENT.QQ.5329_.0&ADPUBNO=26349 声明:本文是写给弱校ACM新手的一点

我们依旧在追梦的路上-山东省第六届ACM比赛总结

这场比赛从结果而言达到了预期(金牌),从过程而言和我的预期相差甚远(打的太乱,个人发挥很差),还好关键时刻队友抗住压力,负责后果真的不堪设想。 热身赛 热身赛纯粹测机器的,先把A,B,C草草水过(A题小写x打成大写的也是醉了),我和老高开始各种测机器,long long不出所料是lld的,试了一下除0和数组越界的re问题,发现没有re,只有wa(甚至数组越界还AC了),至于栈深的话也没过多追