链接:https://ac.nowcoder.com/acm/problem/21797
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

有一个二维棋盘,棋盘有r行c列,棋盘中的每一个位置有如下四种情况
'E': 表示出口,可能有多个
'T': 只有一个,表示起点
'#': 表示障碍
'.': 表示空地

牛牛和牛妹在这样一个棋盘上玩游戏,他们有一张写有整数k的卡片,一开始放置在起点的位置,现在牛牛和牛妹开始轮流操作,牛牛先操作
当前操作的牛会选择上下左右其中一个方向移动卡片,每走一步,卡片上的数字减去1
只能走到空地上, 或者走到出口,走到出口,游戏就会结束,卡片的数字变成0的时候游戏也会结束,不能再移动的牛会输掉游戏

如果牛牛和牛妹都用最佳策略,请问谁会赢

输入描述:

第一行输入3个整数r,c,k
接下来r行每行读入k个字符表示棋盘 1 ≤ r,c ≤ 50, 1 ≤ k ≤ 100

输出描述:

如果牛牛有必胜策略,输出"niuniu"
否则输出"niumei"
示例1

输入

复制

2 3 3
T.#
#.E

输出

复制

niuniu
示例2

输入

复制

3 3 99
E#E
#T#
E#E

输出

复制

niumei
示例3

输入

复制

4 5 13
#E...
#...E
E.T#.
..#..

输出

复制

niuniu

备注:

子任务1:mac(r,c) <= 10
子任务2:max(r,c) <= 20
子任务3:无限制

题意:一个r行c列的二维棋盘,有障碍物‘#’和空地‘.’,有多个出口’E‘和一个起点’T‘,从起点开始可以走k步,若k变为0时则把牌的k变为0的这个牛取胜,若能在k步或k步内到达任意一个终点E,则把牌移动到终点的那个牛胜,现在牛牛先手,问牛牛能否必胜
思路:如果从起点出发能到达一个必胜状态,则先手必胜
现在从起点开始搜索周围的点
先看这个点如果上一个牛把牌移动到了当前这个点使得牌的k变为0或到达终点,则现在这只牛就输了,返回一个0
若这个点不发货上述条件,则再从这个点出发,看周围上下左右的点,若能走在棋盘内且还剩余步数,下一步能走到一个点使下一个牛输,则此点是可使这个牛赢的点,否则,若从这个点出发,下一步走不到一个点使下一个牛输的点,则此点是可使这个牛输的点

 #include<bits/stdc++.h>
using namespace std;
const int amn=1e2+;
char mp[][];
int dp[][][amn],r,c,k,dic[][]={{,},{,-},{,},{-,}},dx,dy,si,sj;
int dfs(int x,int y,int k){
if(k<=||mp[x][y]=='E')return dp[x][y][k]=;///如果上一个牛把牌移动到了当前这个点使得牌的k变为0或到达终点,则现在这只牛就输了,返回一个0
if(dp[x][y][k]!=-)return dp[x][y][k]; ///如果这个点被走过了,返回这个状态
for(int i=;i<;i++){
dx=x+dic[i][];
dy=y+dic[i][];
if(dx>=&&dx<=r&&dy>=&&dy<=c&&mp[dx][dy]!='#'&&k>&&!dfs(dx,dy,k-)) ///若从这个点出发,能走在棋盘内且还剩余步数,下一步能走到一个点使下一个牛输,则此点是可使这个牛赢的点
return dp[x][y][k]=;
}
return dp[x][y][k]=; ///若从这个点出发,下一步走不到一个点使下一个牛输的点,则此点是可使这个牛输的点
}
int main(){
ios::sync_with_stdio();
cin>>r>>c>>k;
for(int i=;i<=r;i++){
for(int j=;j<=c;j++){
cin>>mp[i][j];
if(mp[i][j]=='T'){si=i,sj=j;}
}
}
memset(dp,-,sizeof dp);
if(dfs(si,sj,k)==)printf("niuniu\n"); ///如果从起点出发能到达一个必胜状态,则先手必胜
else printf("niumei\n");
}
/***
一个r行c列的二维棋盘,有障碍物‘#’和空地‘.’,有多个出口’E‘和一个起点’T‘,从起点开始可以走k步,若k变为0时则把牌的k变为0的这个牛取胜,若能在k步或k步内到达任意一个终点E,则把牌移动到终点的那个牛胜,现在牛牛先手,问牛牛能否必胜
如果从起点出发能到达一个必胜状态,则先手必胜
现在从起点开始搜索周围的点
先看这个点如果上一个牛把牌移动到了当前这个点使得牌的k变为0或到达终点,则现在这只牛就输了,返回一个0
若这个点不发货上述条件,则再从这个点出发,看周围上下左右的点,若能走在棋盘内且还剩余步数,下一步能走到一个点使下一个牛输,则此点是可使这个牛赢的点,否则,若从这个点出发,下一步走不到一个点使下一个牛输的点,则此点是可使这个牛输的点
***/

最新文章

  1. NFS 文件系统
  2. linux下使用fork,exec,waitpid模拟system函数
  3. Python【3】-字典dic和集合set
  4. 原生js实现滚动条
  5. linux网络学习
  6. asp.net(C#)利用QRCode生成二维码(续)-在二维码图片中心加Logo或图像
  7. 博弈SG
  8. Leetcode#80 Remove Duplicates from Sorted Array II
  9. Javascript注意事项三【使用假值】
  10. 【弱省胡策】Round #6 String 解题报告
  11. java.sql.SQLException: Lock wait timeout exceeded --转
  12. TypeScript 素描 - 装饰器
  13. SICP-1.5-控制结构
  14. 钉钉自定义机器人配合SVN钩子事件进行消息的推送实践
  15. 如何使用纯 CSS 制作四子连珠游戏
  16. 2017-10-22模拟赛T2 或(or.*)
  17. Win7远程桌面:发生身份验证错误
  18. gradle配置统一管理
  19. Unity 之 插件下载
  20. golang 实现海明距离 demo

热门文章

  1. vue项目实战
  2. 空间数据导入Oracle数据库备忘
  3. 如何看待Java是世界上最好的语言?
  4. Java 在PDF中添加表格
  5. MyBatis配置文件中config与mapper的约束
  6. mysql 存储过程 执行存储过程修改了表中所有行的信息
  7. 2020年春招面试必备Spring系列面试题129道(附答案解析)
  8. Service Mesh - gRPC 本地联调远程服务
  9. 读《Java并发编程的艺术》学习笔记(二)
  10. JAVA 16bit CRC_CCITT