ACM题目整理

合集下载

大学ACM考试题目及作业答案整理

大学ACM考试题目及作业答案整理

ACM作业与答案整理1、平面分割方法:设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。

#include <iostream.h>int f(int n){if(n==1) return 2;else return f(n-1)+2*(n-1);}void main(){int n;while(1){cin>>n;cout<<f(n)<<endl;}}2、LELE的RPG难题:有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.编程全部的满足要求的涂法.#include<iostream.h>int f(int n){if(n==1) return 3;else if(n==2) return 6;else return f(n-1)+f(n-2)*2;}void main(){int n;while(1){cin>>n;cout<<f(n)<<endl;}}3、北大ACM(1942)Paths on a GridTime Limit: 1000MS Memory Limit: 30000K DescriptionImagine you are attending your math lesson at school. Once again, you are bored because your teacher tells things that you already mastered years ago (this time he's explaining that (a+b)2=a2+2ab+b2). So you decide to waste your time with drawing modern art instead.Fortunately you have a piece of squared paper and you choose a rectangle of size n*m on the paper. Let's call this rectangle together with the lines it contains a grid. Starting at the lower left corner of the grid, you move your pencil to the upper right corner, taking care that it stays on the lines and moves only to the right or up. The result is shown on the left:Really a masterpiece, isn't it? Repeating the procedure one more time, you arrive with the picture shown on the right. Now you wonder: how many different works of art can you produce?InputThe input contains several testcases. Each is specified by two unsigned 32-bit integers n and m, denoting the size of the rectangle. As you can observe, the number of lines of the corresponding grid is one more in each dimension. Input is terminated by n=m=0.OutputFor each test case output on a line the number of different art works that can be generated using the procedure described above. That is, how many paths are there on a grid where each step of the path consists of moving one unit to the right orone unit up? You may safely assume that this number fits into a 32-bit unsigned integer.Sample Input5 41 10 0Sample Output1262#include<iostream>using namespace std;longlong f(long long m, long long n){if(n==0) return 1;else return f(m-1,n-1)*m/n;}int main(){longlongm,n;while(scanf("%I64d %I64d",&n,&m) &&n+m){printf("%I64d\n",f(m+n,min(m,n)));}return 0;}1、(并查集)若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。

acm数学竞赛试题

acm数学竞赛试题

acm数学竞赛试题
ACM数学竞赛试题通常涉及各种数学领域,包括但不限于代数、几何、概率统计和组合数学等。

以下是一些经典的ACM数学竞赛试题:
1. 平面上n个点的k距离和最小值问题:给定平面上n个点,对于每个点,计算它到其他所有点的距离,然后求出这些距离中的k个最小值。

问题是:如何有效地计算这k个最小值?
2.最长公共子序列问题:给定两个序列,找出它们的最长公共子序列。

例如,对于序列
A = [1, 2, 3, 4] 和
B = [2, 3, 4, 5],最长公共子序列是[2, 3, 4]。

3. 凸包问题:给定平面上的一组点,找到一个最小的凸多边形,使得这个多边形能够包含这组点中的所有点。

4. 最短路问题:给定一个有向图,其中每条边都有一个非负的权重,找出图中任意两点之间的最短路径。

5. 子集和问题:给定一个正整数数组和一个目标值,判断数组中是否存在和为目标值的两个非空子集。

例如,给定数组[1, 2, 3, 4] 和目标值7,判断是否存在两个子集,它们的和分别为7。

以上只是ACM数学竞赛试题的一部分,实际上还有更多涉及数学各个领域的题目。

要提高解决这类问题的能力,需要不断练习和研究。

ACM考试题

ACM考试题

ACM程序设计东北林业大学陈宇Lg_chenyu@第一讲算法原理和ACM入门(Introduction to ACM)我校的ACM在线评测系统**课件下载地址:*/kj/suanfa01.ppt预期赛事(今后每年)*3~4月,举行校内大赛(暨选拔赛)*4月,ACM全国邀请赛*5月,参加黑龙江省大学生程序设计大赛*6月,参加东北4省大学生程序设计大赛*10~11月,参加ACM/ICPC亚洲区比赛(至少参加4~5个赛区的比赛)*另外,每学期至少有三次月赛以及适当的练习赛第一部分算法概述*算法分析(Algorithm Analysis):对算法所需要的两种计算机资源——时间和空间进行估算;时间复杂性(Time Complexity)空间复杂性(Space Complexity)算法分析的目的:设计算法——设计出复杂性尽可能低的算法选择算法——在多种算法中选择其中复杂性最低者算法的描述语言:⑴自然语言优点:容易理解缺点:冗长、二义性使用方法:粗线条描述算法思想注意事项:避免写成自然段(2)流程图优点:流程直观缺点:缺少严密性、灵活性使用方法:描述简单算法注意事项:注意抽象层次⑶程序设计语言优点:能由计算机执行缺点:抽象性差,对语言要求高使用方法:算法需要验证注意事项:将算法写成子函数(4)伪代码——算法语言伪代码(Pseudocode):介于自然语言和程序设计语言之间的方法,它采用某一程序设计语言的基本语法,操作指令可以结合自然语言来设计。

优点:表达能力强,抽象性强,容易理解评价算法*评价算法的三条主要标准是:*(1) 算法实现所耗费的时间;*(2) 算法实现所所耗费的存储空间,其中*主要考虑辅助存储空间;*(3) 算法应易于理解,易于编码,易于调*试等等。

和算法执行时间相关的因素:1)问题中数据存储的数据结构2)算法采用的数学模型3)算法设计的策略4)问题的规模5)实现算法的程序设计语言6)编译算法产生的机器代码的质量7)计算机执行指令的速度算法效率的衡量方法*通常有两种衡量算法效率的方法:*1)事后统计法(有缺点,较少使用)*2)事前分析估算法*算法的时间效率是问题规模的函数。

计算机acm试题及答案

计算机acm试题及答案

计算机acm试题及答案一、选择题1. 在计算机科学中,ACM代表什么?A. 人工智能与机器学习B. 计算机辅助制造C. 计算机辅助设计D. 国际计算机学会答案:D2. 下列哪个不是计算机程序设计语言?A. PythonB. JavaC. C++D. HTML答案:D3. 在计算机系统中,CPU代表什么?A. 中央处理单元B. 计算机辅助设计C. 计算机辅助制造D. 计算机辅助教学答案:A二、填空题1. 计算机的内存分为__________和__________。

答案:RAM;ROM2. 在编程中,__________是一种用于存储和操作数据的数据结构。

答案:数组3. 计算机病毒是一种__________,它能够自我复制并传播到其他计算机系统。

答案:恶意软件三、简答题1. 请简述计算机操作系统的主要功能。

答案:计算机操作系统的主要功能包括管理计算机硬件资源,提供用户界面,运行应用程序,以及控制其他系统软件和应用软件的运行。

2. 什么是云计算,它与传统的本地计算有何不同?答案:云计算是一种通过互联网提供计算资源(如服务器、存储、数据库、网络、软件等)的服务模式。

与传统的本地计算相比,云计算允许用户按需获取资源,无需购买和维护物理硬件,具有更高的灵活性和可扩展性。

四、编程题1. 编写一个程序,计算并输出从1到100(包括1和100)之间所有偶数的和。

答案:```pythonsum = 0for i in range(1, 101):if i % 2 == 0:sum += iprint(sum)```2. 给定一个字符串,编写一个函数,将字符串中的所有字符按ASCII 码值排序并返回。

答案:```pythondef sort_string(s):return ''.join(sorted(s))```五、论述题1. 论述计算机硬件和软件之间的关系及其对计算机系统性能的影响。

答案:计算机硬件是计算机系统的物质基础,包括CPU、内存、硬盘等,而软件则是运行在硬件上的程序和数据。

ACM题目、测试用例及参考答案汇编——一次ACM协会内部测试

ACM题目、测试用例及参考答案汇编——一次ACM协会内部测试

ACM题目、测试用例及参考答案汇编——一次ACM协会内部测试第一题:梦境是虚幻吗?时间限制:3000ms 内存限制:65535KB 难度:★★描述《盗梦空间》是一部精彩的影片,在这部电影里,Cobb等人可以进入梦境之中,梦境里的时间会比现实中的时间过得快得多,这里假设现实中的3分钟,在梦里就是1小时。

然而,Cobb他们利用强效镇静剂,可以从第一层梦境进入第二层梦境,甚至进入三层,四层梦境,每层梦境都会产生同样的时间加速效果。

那么现在给你Cobb在各层梦境中经历的时间,你能算出现实世界过了多长时间吗?比如,Cobb先在第一层梦境待了1个小时,又在第二层梦境里待了1天,之后,返回第一层梦境之后立刻返回了现实。

那么在现实世界里,其实过了396秒(6.6分钟)输入第一行输入一个整数T(0<=T<=100),表示测试数据的组数。

每组测试数据的第一行是一个数字M(3<=M<=100)随后的M行每行的开头是一个字符串,该字符串如果是"IN" 则Cobb向更深层的梦境出发了,如果是字符串"OUT"则表示Cobb从深层的梦回到了上一层。

如果是首字符串是"STAY"则表示Cobb在该层梦境中停留了一段时间,本行随后将是一个整数S表示在该层停留了S分钟(1<=S<=10000000)。

数据保证在现实世界中,时间过了整数秒。

输出对于每组测试数据,输出现实世界过的时间(以秒为单位)。

样例输入16INSTAY 60INSTAY 1440OUTOUT样例输出396测试输入106INSTAY 60INSTAY 1440OUTOUT6INININOUTOUTOUT7INININSTAY 0 OUTOUTOUT2INSTAY 203INSTAY 0 OUT3INSTAY 10 OUT4INSTAY 10 STAY 10 OUT5INSTAY 20 STAY 20 OUT STAY 120 10INSTAY 20 STAY 20 INSTAY 1440STAY 1440OUTSTAY 120OUTSTAY 11STAY 50测试输出39660306073209723000参考代码:#include<stdio.h>int main(){int n;char a[5];scanf("%d",&n);while(n--){int m,i,b=1,c,time=0;scanf("%d",&m);for(i=0;i<m;i++){scanf("%s",&a);if(a[0]=='I') b*=20;else if(a[0]=='S') {scanf("%d",&c);time+=c*60/b;} else if(a[0]=='O') b/=20;}printf("%d\n",time);}return 0;}第二题:独木舟过河时间限制:3000ms 内存限制:65535KB 难度:★★描述进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别。

ACM中的数学问题March总结

ACM中的数学问题March总结
第22页/共96页
欧几里德算法
• 欧几里德算法 (The Euclidean Algorithm) • 又称辗转相除法 或者 短除法 • 原理: gcd(a,b) = gcd(b,a mod b) • 证明: • 利用整除性质5(a=kb±c => a,b的公因数与b,c的公因数完全相同) • 辗转相除直到两数整除,其中的除数就是要求的最大公约数。
第16页/共96页
请写出12,10共有的倍 数
第17页/共96页
请写出12,10共有的倍 数
60,
第18页/共96页
请写出12,10共有的倍 数
60, 120,
第19页/共96页
请写出12,10共有的倍 数
60, 120, 180,
第20页/共96页
请写出12,10共有的倍 数
60, 120, 180, 240…
第7页/共96页
整除的基本性质
• 性质1: • a|b,b|c => a|c
• 性质2 : • a|b => a|bc
• 性质3 : • a|b,a|c => a|kb±lc
• 性质4 : • a|b,b|a => a=±b
第8页/共96页
整除的基本性质
• 性质5 : • a=kb±c => a,b的公因数与b,c的公因数完全相同 • 证明: • 假设d是b,c的公因数,即d|b, d|c。 • 利用整除性质3,d整除b,c的线性组合,故d|a。 • 所以d是a,b的公因数 • 反之,如果d是a,b的公因数,也能证出d是b,c的公因数
第34页/共96页
扩展欧几里德算法
• 扩展欧几里德算法(递归实现):
第35页/共96页
扩展欧几里德算法

ACM题目分类

ACM题目分类
三.数据结构.
(1)串 (poj1035,poj3080,poj1936)
(2)排序(快排、归并排(与逆序数有关)、堆排) (poj2388,poj2299)
(3)简单并查集的应用.
(4)哈希表和二分查找等高效查找法(数的Hash,串的Hash)
(3)点集最小圆覆盖.
(4)对踵点(poj2079)
八.综合题.
(poj3109,poj1478,poj1462,poj2729,poj2048,poj3336,poj3315,poj2148,poj1263)
同时由于个人练习的时候可能有些偏向性,可能上面的总结不是很全,还请大家提出和指正,而且由于ACM的题目中专门针对某个算法的题目可能比较少出现,所以上面的分类中的题有可能有多种解法或者是一些算法的综合,这都不会影响大家做题,希望练习的同学能够认真,扎实地训练,做到真正的理解算法,掌握算法. 同时在论坛上还有许多前辈的分类,总结,大家也可以按自己的情况采用.注意FTP上有很多的资料,希望大家好好地利用.
目的). (poj2823)
(4)左偏树(可合并堆).
(5)后缀树(非常有用的数据结构,也是赛区考题的热点).
(poj3415,poj3294)
四.搜索
(1)较麻烦的搜索题目训练(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)
(5)杂题.
(poj1870,poj3296,poj3286,poj1095)
七.计算几何学.
(1)坐标离散化.
(2)扫描线算法(例如求矩形的面积和周长并,常和线段树或堆一起使用).
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)

acm大学生程序设计试题

acm大学生程序设计试题

acm大学生程序设计试题题目一:最大公约数(GCD)题目描述:给定两个正整数,求它们的最大公约数(GCD)。

输入两个正整数a和b(1 <= a, b <= 10^9),求它们的最大公约数。

输入格式:两个正整数,以空格分隔。

输出格式:输出一个整数,表示输入两个正整数的最大公约数。

示例:输入:14 21输出:7思路和分析:最大公约数(GCD)可以使用欧几里得算法来求解,即辗转相除法。

具体的步骤如下:1. 用较大的数除以较小的数,将得到的余数作为新的较大数。

2. 再用新的较大数除以较小数,将得到的余数作为新的较大数。

3. 如此重复,直到两个数可以整除,此时较小的数就是最大公约数。

代码实现:```cpp#include <iostream>using namespace std;int gcd(int a, int b) {if (b == 0)return a;return gcd(b, a % b);}int main() {int a, b;cin >> a >> b;int result = gcd(a, b);cout << result << endl;return 0;}```题目二:字符串反转题目描述:给定一个字符串,要求将其反转并输出。

输入一个字符串s(1 <= |s| <= 1000),输出该字符串的反转结果。

输入格式:一个字符串s,只包含大小写字母和数字。

输出格式:一个字符串,表示输入字符串的反转结果。

示例:输入:HelloWorld123输出:321dlroWolleH思路和分析:字符串反转可以使用双指针的方法来实现。

初始时,左指针指向字符串的开头,右指针指向字符串的末尾,然后交换左右指针所指向的字符,并向中间移动,直到左指针不小于右指针。

代码实现:```cpp#include <iostream>using namespace std;string reverseString(string s) {int left = 0, right = s.length() - 1; while (left < right) {swap(s[left], s[right]);left++;right--;}return s;}int main() {string s;cin >> s;string result = reverseString(s); cout << result << endl;return 0;}```题目三:字符串匹配题目描述:给定一个字符串s和一个模式串p,判断s中是否存在与p相匹配的子串。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目来源:福州大学acm网站代码:fpcdq一、入门熟悉ACM竞赛规则以及程序提交注意事项例题:Problem 1000 A+B ProblemTime Limit: 1000 mSec Memory Limit : 32768 KB Problem DescriptionCalculate a + b.InputThe input will consist of a series of pairs of integers a and b,separated by a space, one pair of integers per line.OutputFor each pair of input integers a and b you should output the sum of a and b in one line,and with one line of output for each line in input.Sample Input1 52 3Sample Output65My answer:#include <stdio.h>main(){long a,b;while((scanf("%ld%ld",&a,&b))!=EOF){printf("%ld\n",a+b);}}详情参考/faq.php二、ACM分类主流算法:1.搜索//回溯Problem 1019 猫捉老鼠Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description一只猫和一只老鼠在10*10的迷宫中。

迷宫中的每个方格可以是空的,或者含有障碍。

猫和老鼠可以进入任意一个空的方格中。

当他们相遇时,猫和老鼠在同一个方格中。

但是,无论猫或老鼠都不能进入有障碍的方格。

我们可以用字符组成的二维数组表示迷宫,如下图所示。

老鼠在迷宫中按照一种固定的方式行走:每个时刻,老鼠都向它所面对的方向前进一格,这需要花费1秒时间。

如果前方是一个障碍或者是迷宫的边界,它将花1秒的时间按顺时针方向转90度。

为了抓到老鼠,这只猫决定也按照与老鼠相同的行走方式行进。

猫和老鼠在每个单位时间内是同时行动的。

因此,如果猫和老鼠在行进过程中“擦肩而过”,猫是无法捉到老鼠的。

只有当猫和老鼠同时到达一个相同的格子时,猫才能捉住老鼠。

初始时,猫和老鼠不会在同一个方格中。

并且它们都面向北方。

你的任务是编一个程序,求出猫捉到老鼠的所花时间。

Input输入数据的第一行n,表示输入数据的组数。

每组数据由10行组成,每行10个字符,表示迷宫的地图以及猫和老鼠的初始位置。

输入数据保证只有一只猫和一只老鼠。

每组输入数据之后均有一个空行作为间隔。

Output对于每组给定的输入,输出一行仅含一个数,即猫捉到老鼠所花的时间。

如果猫永远都无法抓到老鼠,则输出0。

Sample Input1*...*...........*......*...*...............*.c....*.....*......*........m......*...*.*.....*.*......Sample Output49My answer:#include <stdio.h>char str[12][12];void doing(int *fs,int *x,int *y){if(*fs==1){if(str[*x-1][*y]=='*') *fs=4;else *x=*x-1;}else if(*fs==2){if(str[*x+1][*y]=='*') *fs=3;else *x=*x+1;}else if(*fs==3){if(str[*x][*y-1]=='*') *fs=1;else *y=*y-1;}else{if(str[*x][*y+1]=='*') *fs=2;else *y=*y+1;}}main(){int i,j,k,n,p,fs1,fs2,x1,y1,x2,y2;scanf("%d",&n);getchar();for(i=0;i<=11;i++){str[i][0]='*';str[i][11]='*';str[0][i]='*';str[11][i]='*';}for(i=1;i<=n;i++){fs1=1;fs2=1;p=1;for(j=1;j<=10;j++){for(k=1;k<=10;k++){scanf("%c",&str[j][k]);if(str[j][k]=='c'){x1=j;y1=k;str[j][k]='.';}if(str[j][k]=='m'){x2=j;y2=k;str[j][k]='.';}}getchar();}for(j=1;j<10000;j++){doing(&fs1,&x1,&y1);doing(&fs2,&x2,&y2);if(x1==x2&&y1==y2){printf("%d\n",j);p=0;break;}}if(p)printf("0\n");if(i<n)getchar();}}Problem 1063 三维扫描Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description工业和医学上经常要用到一种诊断技术——核磁共振成像(Magnetic Resonance Imagers)。

利用该技术可以对三维物体(例如大脑)进行扫描。

扫描的结果用一个三维的数组来保存,数组的每一个元素表示空间的一个象素。

数组的元素是0-255的整数,表示该象素的灰度。

例如0表示该象素是黑色的,255表示该象素是白色的。

被扫描的物体往往是由若干个部件组合而成的。

例如临床医学要对病变的器官进行检查,而器官是由一些不同的组织构成的。

在实际问题中,同一个部件内部的色彩变化相对连续,而不同的部件的交界处色彩往往有突变。

下面是一个简化的植物细胞的例子。

从细胞的平面图来看,该细胞大致是由四个“部件”构成的,细胞壁、细胞核、液泡和细胞质。

为了方便起见,我们对部件的概念做如下的规定:1.如果一个象素属于某部件,则或者该象素至少与该部件的一个象素相邻,或者该象素单独组成一个部件。

(说明:每一个象素与前后、左右、上下的6个象素相邻)2.同一个部件内部,相邻两个象素的灰度差不超过正整数M。

M决定了程序识别部件的灵敏度。

你的任务是对于给定的物体,判断该物体是由几个部件组成的。

Input输入数据由多组数据组成。

每组数据格式如下:第一行是三个正整数L,W,H(L,W,H≤50),表示物体的长、宽、高。

第二行是一个整数M(0≤M≤255),表示识别部件的灵敏度。

接下来是L×W×H个0-255的非负整数,按照空间坐标从小到大的顺序依次给出每个象素的灰度。

说明:对于空间两点P1(x1,y1,z1)和P2(x2,y2,z2),P1<P2当且仅当(x1<x2)或者(x1=x2且y1<y2)或者(x1=x2且y1=y2且z1<z2) Output对于每组数据,输出仅一行包含一个整数M,即一共识别出几个部件。

Sample Input2 2 21 1 1 12 2 2 2Sample Output2My answer:#include <stdio.h>#include <math.h>int m,l,w,h,c[51][51][51];long sum;doing(int i,int j,int r){int q;q=c[i][j][r];c[i][j][r]=-1;if(i-1>0)if(c[i-1][j][r]!=-1)if(fabs(c[i-1][j][r]-q)<=m)doing(i-1,j,r);if(i+1<=l)if(c[i+1][j][r]!=-1)if(fabs(c[i+1][j][r]-q)<=m)doing(i+1,j,r);if(j-1>0)if(c[i][j-1][r]!=-1)if(fabs(c[i][j-1][r]-q)<=m)doing(i,j-1,r);if(j+1<=w)if(c[i][j+1][r]!=-1)if(fabs(c[i][j+1][r]-q)<=m)doing(i,j+1,r);if(r-1>0)if(c[i][j][r-1]!=-1)if(fabs(c[i][j][r-1]-q)<=m)doing(i,j,r-1);if(r+1<=h)if(c[i][j][r+1]!=-1)if(fabs(c[i][j][r+1]-q)<=m)doing(i,j,r+1);}main(){int i,j,r;while(scanf("%d%d%d",&l,&w,&h)!=EOF){scanf("%d",&m);for(i=1;i<=l;i++)for(j=1;j<=w;j++)for(r=1;r<=h;r++)scanf("%d",&c[i][j][r]);sum=0;for(i=1;i<=l;i++)for(j=1;j<=w;j++)for(r=1;r<=h;r++)if(c[i][j][r]!=-1){sum++;doing(i,j,r);}printf("%d\n",sum);}}Problem 1073 Raiders of the Lost Ark Time Limit: 1000 mSec Memory Limit : 32768 KB Problem DescriptionIn this famous film, renowned archeologist and expert in the occult, Dr. Indiana Jones, is hired by the U.S. Government to find the Ark of the Covenant, which is believed to still hold the ten commandments. Unfortunately, agents of Hitler are also after the Ark. Dr. Jones escapes from various close scrapes in a quest that takes him from Nepal to Cairo. Your task is to help him to find the lost Ark of the Covenant in the maze earlier than the enemy.There are several barriers in the maze, Dr. Jones can bypass these barriers on foot or by jump .He can go on foot in four directions of east, south, west and north to reach a neighboring position. He can also jump cross a cell in the directions of southeast, southwest, northeast and northwest to reach a new position. The following figure shows Dr. Jones's action where O denotes the original position and X denotes the new possible positions after one action.InputThe first line of the input is an integer n (0<=n<=20), denoting the number of test cases. The following lines are the data of n test cases. The first line of each test case consists of two integer x and y (0<x<10, 0<y<10). The next x lines describe the maze matrix, which contains x rows and y columns. In the matrix, 'W' denotes the barrier, 'B' denotes the enterable position, 'S' denotes the starting position, and 'X' denotes the position of the ark. There have and only have one 'S' and one 'X' in a maze matrix.OutputFor each test case, output one line. If there is a solution for the problem, output the number of the least steps to find the Ark. Otherwise output "NO ANSWER".Sample Input33 3SWBBWBXBB5 4BXWBBBWSBBWBBBWBBBBB3 2WXWWWSSample Output22NO ANSWERMy answer:#include <stdio.h>int n,m,p[13][13],x1,x2,y1,y2;char s[13][13];doing(int x,int y,int z){if(z>=p[x][y])return 0;p[x][y]=z;if(x-1>0)if(s[x-1][y]=='B')doing(x-1,y,z+1);if(y-1>0)if(s[x][y-1]=='B')doing(x,y-1,z+1);if(x<n)if(s[x+1][y]=='B')doing(x+1,y,z+1);if(y<m)if(s[x][y+1]=='B')doing(x,y+1,z+1);if(x-2>0&&y-2>0)if(s[x-2][y-2]=='B')doing(x-2,y-2,z+1);if(x-2>0&&y+2<=m)if(s[x-2][y+2]=='B')doing(x-2,y+2,z+1);if(x+2<=n&&y-2>0)if(s[x+2][y-2]=='B')doing(x+2,y-2,z+1);if(x+2<=n&&y+2<=m)if(s[x+2][y+2]=='B')doing(x+2,y+2,z+1);}main(){int i,j,r,k;scanf("%d",&k);for(r=1;r<=k;r++){scanf("%d%d%*c",&n,&m);for(i=1;i<=n;i++){for(j=1;j<=m;j++){p[i][j]=20000;scanf("%c",&s[i][j]);if(s[i][j]=='S'){x1=i;y1=j;s[i][j]='B';}if(s[i][j]=='X'){x2=i;y2=j;s[i][j]='B';}}getchar();}doing(x1,y1,0);if(p[x2][y2]==20000)printf("NO ANSWER\n");else printf("%d\n",p[x2][y2]);}}Problem 1081 等分液体Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description有三种容器R1,R2,R3,其容积分别是L,M,N。

相关文档
最新文档