ACM题目整理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目来源:福州大学acm网站
代码:fpcdq
一、入门
熟悉ACM竞赛规则以及程序提交注意事项
例题:
Problem 1000 A+B Problem
Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description
Calculate a + b.
Input
The input will consist of a series of pairs of integers a and b,separated by a space, one pair of integers per line.
Output
For 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 Input
1 5
2 3
Sample Output
6
5
My answer:
#include
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 Input
1
*...*.....
......*...
...*...*..
..........
...*.c....
*.....*...
...*......
..m......*
...*.*....
.*.*......
Sample Output
49
My answer:
#include
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 } }