题目:MC0101冰雪大冒险
难度:白银 时间限制:1秒 占用内存:128M
小码哥最近在玩一个游戏叫做冰雪大冒险,这个游戏在一个n行m列的网格上进行。某些格子上存在一些无法通过的障碍物,其余格子均是光滑的冰面玩家初始在其中一个非障碍物格子上,且保持静止然后他会操控角色进行上下左右移动,当他控制角色朝一个方向移动时,角色会在冰面上一直滑行直到角色移动方向的下一个格子为障碍物或者超出地图边界时,角色才会停止移动,然后继续等待小码哥的下一个操作。现在给出地图中所有障碍物的位置,小码哥的初始位置和小码哥的操作序列,请你求出小码哥最终停留的位置。
输入格式:
第一行输入两个整数n m(2≤n,m≤100) ,表示地图的行数和列数
第二行输入两个整数 x,y(1≤x≤n,1≤y≤m) ,表示小码哥初始在第行第y列。
第三行输入一个整数 k(1≤k≤n*m-1) ,表示地图上障碍物个数。
接下来输入k行,每行输入两个数字a, b,表示第个障碍物的位置在第a,行,第b列。保证输入障碍物不会重叠,且不会出现在小码哥初始位置上。
最后输入一行长度不超过1000,仅包含LRUD四种字母的字符串。字符串中的第个字母表示小码哥第步操作的运动方向。其中LRUD依次表示向左、向右、向上和向下。
输出格式:
输出两个用空格隔开的数字,表示小码哥最终所在位置的行号和列号。
算法思想:
这个问题可以使用模拟的方法来解决。首先,我们需要创建一个大小为 n 行 m 列的地图,标记其中有障碍物的格子。然后,我们将小码哥的初始位置标记在地图上。接着,我们按照小码哥的操作序列逐步更新小码哥的位置,直到遇到障碍物或地图边界为止。最后,输出小码哥最终停留的位置。
在地图范围内且没有障碍物则持续移动,碰到障碍物或者到边界则停止。可以用while循环来表示物体移动,当超出范围或者碰见障碍物则停止循环。
代码:
#include<stdio.h>
#include <string.h>
int main()
{
int n,m,x,y,k;
scanf("%d %d",&n,&m);
scanf("%d %d",&x,&y);
scanf("%d",&k);
int a[101][101]={0};
for(int i = 0 ;i < k;i++){
int b,c;
scanf("%d %d",&b,&c);
a[b][c]=1;
}
char d[1000];
int q=0;//是否有障碍物,有为1,没有则为0
scanf("%s",d);
for(int i=0;i<strlen(d);i++){
if(d[i]=='L'){
while(x>=1&&x<=n&&y>=1&&y<=m&&a[x][y-1]!=1&&q==0){
if(y!=1){
y--;
}else{
q=1;
}
}
}else if(d[i]=='R'){
while(x>=1&&x<=n&&y>=1&&y<=m&&a[x][y+1]!=1&&q==0){
if(y!=m){
y++;
}else{
q=1;
}
}
}else if(d[i]=='U'){
while(x>=1&&x<=n&&y>=1&&y<=m&&a[x-1][y]!=1&&q==0){
if(x!=1){
x--;
}else{
q=1;
}
}
}else if(d[i]=='D'){
while(x>=1&&x<=n&&y>=1&&y<=m&&a[x+1][y]!=1&&q==0){
if(x!=n){
x++;
}else{
q=1;
}
}
}
q=0;
}
printf("%d %d",x,y);
return 0;
}
调试通过。
MC0102 房间打扫
难度:白银 时间限制:1秒 占用内存:128M
小码哥准备去打扫一间房间。这个房间可以简单地看成由n 行n 列,一共n×n个格子组成。每个格子的初始状态要么是干净的,要么是脏的。小码哥打扫房间的方式非常奇怪:如果他打扫了一个脏格子,那么这个格子会变干净;反之亦然,如果他打扫了一个干净的格子,那么这个格子会变脏。他想从房间的 n列格子中选择几列进行打扫,希望打扫完后完全干净的行数尽量多。注意,如果他选择了某一列进行打扫,则他需要打扫这一列包含的所有的格子;一行是完全干净的指这一行中所有格子都是干净的。
小码哥并不是很擅长数学,于是希望你帮他计算一下,如果他使用合理的打扫策略,完全干净的行数最多可以有多少。
输入格式:
第一行输入一个整数n(1≤n ≤200),表示房间的大小。输入格式:第一行输入一个整n(1≤n≤200),表示房间的大小.
然后接下来输入n行。第ü行包含一个长度为n 的01字符串,表示房间里第i行格子的初始状态。第j个字符为1表示第ü行第j列的格子是干净的,为0表示是脏的。
输出格式:
输出一个整数,表示最大可能的完全干净的行数。
算法思想:
可能我的方法不是很好,因为测试的数据不是很多。这段代码使用了暴力的方法,枚举了所有列的组合进行模拟打扫操作,然后统计每次操作后房间中完全干净的行数,最后输出最大的完全干净行数。
代码:
#include<stdio.h>
#include<string.h>
int main()
{
int n;
char e[201][201];
int b=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%s",e[i]);
}
for(int i=0;i<n;i++){
char a[201][201];
for(int j=0;j<n;j++){
strcpy(a[j],e[j]);
}
int c = 0;
int d[201]={0};
for(int j=0;j<n;j++){
if(a[i][j]=='0'){
d[c++]=j;
}
}
for(int j=0;j<c;j++){
for(int k=0;k<n;k++){
if(a[k][d[j]]=='1'){
a[k][d[j]]='0';
}else{
a[k][d[j]]='1';
}
}
}
int temp=0;
for(int i=0;i<n;i++){
int temp1 = 0;
for(int j=0;j<n;j++){
if(a[i][j]=='1'){
temp1++;
}
}
if(temp1==n){
temp++;
}
}
if(temp>b){
b=temp;
}
}
printf("%d",b);
return 0;
}
调试结果: