例题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

相关文章

认识、理解、分类——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了),至于栈深的话也没过多追

算法练习小技巧之有序集合--套路详细解析带例题(leetcode)

前言:         本文详细讲解Python中的有序集合SortedList和C++中的有序集合multiset的用法,配合leetcode的例题来展示实际的用处。(本人水平不够,还无法讲解有序集合的实现方法,只会用)         觉得有帮助或者写的不错可以点个赞,后面也有几道我找出来的题目可以用这个方法快速解决的         (感觉有点水) 目录 有序集合用法讲解:

【Markdown】如何在Markdown中合并单元格

Markdown语法本身不包含复杂表格的插入,但是可以使用html语法来实现。 水平单元格的合并:基于colspan属性,即使一个单元格占多列的空间纵向单元格的合并:基于rowspan属性,即使一个单元格占多行的空间 要想MarkDown中插入复杂表格时,可以先在word或excel中把表格写好,然后在如下网站进行转化为标记对形式: http://pressbin.com/tools/exc