猫和老鼠 蓝桥杯/手速/暴力练习赛(暴力搜索)

猫和老鼠 蓝桥杯/手速/暴力练习赛
【题目描述】

猫和老鼠在10*10 的方格中运动,例如:
 *...*.....
 ......*...
 ...*...*..
 ..........
 ...*.C....
 *.....*...
 ...*......
 ..M......*
 ...*.*....
 .*.*......
 C=猫(CAT)
 M=老鼠(MOUSE)
 *=障碍物
 .=空地
 猫和老鼠每秒中走一格,如果在某一秒末他们在同一格中,我们称他们“相遇”。
 注意,“对穿”是不算相遇的。猫和老鼠的移动方式相同:平时沿直线走,下一步如果会走到
 障碍物上去或者出界,就用1 秒的时间做一个右转90 度。一开始他们都面向北方。
 编程计算多少秒以后他们相遇。

【输入格式】

10 行,格式如上

【输出格式】

相遇时间T。如果无解,输出-1。

【样例输入】

*...*.....
 ......*...
 ...*...*..
 ..........
 ...*.C....
 *.....*...
 ...*......
 ..M......*
 ...*.*....
 .*.*......
  1 /*
  2     思路:如果猫和老鼠不相遇,那么一定是猫在某一个格子沿着某一个方向重复走了2次以上并且
  3     老鼠也是这样。
  4 */
  5 #include<iostream>
  6 #include<cstring>
  7 #include<cstdio>
  8 #include<algorithm>
  9 using namespace std;
 10
 11 char mp[15][15];
 12
 13 const int left_dir = 1;
 14 const int right_dir = 2;
 15 const int up = 3;
 16 const int down = 4;
 17 const int mouse = 1;
 18 const int cat = 0;
 19
 20 struct node{
 21     int x, y;
 22     int dir;
 23     node(){
 24         dir = up;
 25     }
 26
 27     bool flag[15][15][5];//记录当前格子在某一个方向上是否走过
 28
 29     void init(int x, int y){
 30         memset(flag, false, sizeof(flag));
 31         this->x = x;
 32         this->y = y;
 33         flag[x][y][up] = true;
 34     }
 35 };
 36
 37 node nd[2];
 38 int cnt = 0;
 39
 40 bool move(int i){
 41     int x=nd[i].x, y=nd[i].y;
 42     int newdir;
 43     switch(nd[i].dir){
 44         case up:
 45             x-=1;
 46             newdir = right_dir;
 47             break;
 48         case down:
 49             x+=1;
 50             newdir = left_dir;
 51             break;
 52         case left_dir:
 53             y-=1;
 54             newdir = up;
 55             break;
 56         case right_dir:
 57             y+=1;
 58             newdir = down;
 59             break;
 60     }
 61     if(mp[x][y] != ‘*‘){
 62         nd[i].x = x;
 63         nd[i].y = y;
 64     } else {
 65         nd[i].dir = newdir;
 66     }
 67
 68     if(!nd[i].flag[x][y][nd[i].dir]){
 69         nd[i].flag[x][y][nd[i].dir] = true;
 70         return true;
 71     } else return false;
 72 }
 73
 74 void test(){
 75     bool flag = true, flag1=false, flag2=false;
 76     while(flag){
 77         if(nd[cat].x == nd[mouse].x && nd[cat].y == nd[mouse].y) break;
 78         if(!move(cat))
 79             flag1 = true;
 80         if(!move(mouse))
 81             flag2 = true;
 82         ++cnt;
 83         if(flag1 && flag2) flag = false;
 84     }
 85     if(flag) printf("%d\n", cnt);
 86     else printf("-1\n");
 87 }
 88
 89 int main() {
 90     memset(mp, ‘*‘, sizeof(mp));
 91     for(int i=1; i<=10; ++i){
 92         scanf("%s", mp[i]+1);
 93         mp[i][strlen(mp[i]+1)+1] = ‘*‘;
 94         for(int j=1; j<=10; ++j){
 95             if(mp[i][j]==‘C‘){
 96                 nd[cat].init(i, j);
 97                 mp[i][j] = ‘.‘;
 98             }
 99             else if(mp[i][j] == ‘M‘){
100                 nd[mouse].init(i, j);
101                 mp[i][j] = ‘.‘;
102             }
103         }
104         getchar();
105     }
106     test();
107     return 0;
108 }
109 /*
110 *...*.....
111 ......*...
112 ...*...*..
113 ..........
114 ...*.C....
115 *.....*...
116 ...*......
117 ..M......*
118 ...*.*....
119 .*.*......
120 */
时间: 2024-10-23 08:32:47

猫和老鼠 蓝桥杯/手速/暴力练习赛(暴力搜索)的相关文章

蓝桥杯训练 字串统计 (暴力+substr)

算法训练 字串统计 时间限制:1.0s   内存限制:512.0MB 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的. 输入格式 第一行一个数字L. 第二行是字符串S. L大于0,且不超过S的长度. 输出格式 一行,题目要求的字符串. 输入样例1: 4 bbaabbaaaaa 输出样例1: bbaa 输入样例2: 2 bbaabbaaaaa 输出样例2: aa 数据规

2015蓝桥杯 国赛B组 密文搜索

福尔摩斯从X星收到一份资料,全部是小写字母组成. 他的助手提供了另一份资料:许多长度为8的密码列表. 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的. 请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置.要考虑密码的所有排列可能性. 数据格式: 输入第一行:一个字符串s,全部由小写字母组成,长度小于1024*1024 紧接着一行是一个整数n,表示以下有n行密码,1<=n<=1000 紧接着是n行字符串,都是小写字母组成,长度都为8 要求输出: 一个整数, 表示每行密码的所有排列在s

蓝桥杯 2014本科C++ B组 奇怪的分式 暴力枚举

蓝桥杯 枚举 奇怪的分式 标题:奇怪的分式 上小学的时候,小明经常自己发明新算法.一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png) 老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼! 对于分子.分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢? 请写出所有不同算式的个数(包括题中举例的). 显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式. 但对于分子分母相同的情况

纸牌游戏----蓝桥杯(暴力方法)

蓝桥杯的纸牌游戏,这里我只用了简单的暴力,很费事,其实可以用递归, DP等等来写. 代码: #include <iostream> #include <cstdio> using namespace std; int main() { int a[13]; static int count; int ans = 0; for(a[0]=0; a[0]<=4; a[0]++) { for(a[1]=0; a[1]<=4; a[1]++) { for(a[2]=0; a[2

蓝桥杯:史丰收速算

*/--> pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;}

蓝桥杯练习系统算法提高 求最大值

问题描述 给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大.并且要求你选定的数对的ai之和非负,bi之和非负. 输入格式 输入的第一行为n,数对的个数 以下n行每行两个整数 ai bi 输出格式 输出你选定的数对的ai+bi之和 样例输入 5-403 -625-847 901-624 -708-293 413886 709 样例输出 1715 数据规模和约定 1<=n<=100 -1000<=ai,bi<=1000 思路: 讲道理好嘛~~自己

蓝桥杯 星际交流

算法训练 星际交流 时间限制:1.0s   内存限制:256.0MB 锦囊1 排列生成. 锦囊2 使用组合公式可以算出某一位增加一个的时候数字是增加多少.从左到右依次考虑,如果增加量还没到要求的就增加. 问题描述 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法.这种交流方法是这样 的,首先,火星人把一个非常大的数字告诉人类科学家,科学家破解这个数字的含义后,再把一个很小的数字加到这个大数上面,把结果告诉火星人,作为人类

算法笔记_212:第七届蓝桥杯软件类决赛真题(Java语言B组)

目录 1 愤怒小鸟 2 反幻方 3 打靶 4 路径之谜 5 碱基 6 圆圈舞 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 愤怒小鸟 愤怒小鸟 X星球愤怒的小鸟喜欢撞火车! 一根平直的铁轨上两火车间相距 1000 米 两火车 (不妨称A和B) 以时速 10米/秒 相对行驶. 愤怒的小鸟从A车出发,时速50米/秒,撞向B车, 然后返回去撞A车,再返回去撞B车,如此往复.... 两火车在相距1米处停车. 问:这期间愤怒的小鸟撞 B 车多少次? 注意:需要提交的是一个整数(表示撞B车的次数),不要

2015年蓝桥杯省赛B组C/C++(试题+答案)

首先说,这次我是第二次参加蓝桥杯(大学里最后一次),可这次去连个三等都没拿到,有些心灰意冷,比上一次还差, 当时看到成绩出来的时候有些失落,但是跌倒了,再站起来继续跑就可以了.可能是状态不好吧,纯属自我安慰. 接下来我把今年的题目又重新做了一遍,写下了这篇博客,如果也有需要探讨答案的,希望可以有帮助. 第一题: 第1题:统计不含4的数字 题目大意 统计10000至99999中,不包含4的数值个数. 解题分析: 第一种解法: 数学方法,这种是在网上看到的一种解法: 最高位除了0.4不能使用,其余8