主题链接:点击打开链接

意甲冠军:

特定n*m矩阵

# 是墙 . 和字母是平地

最多有26个字母(不反复出现)

以下k个指令。

每一个指令代表移动的方向和步数。

若以某个字母为起点,依次运行全部的指令,不论什么过程都不会撞到墙或走出地图。则这个字母合法。

按字典序输出全部合法的字母。若没有字母合法则输出' no solution'

预处理一下前缀和然后暴力。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <vector>
#include <map>
using namespace std;
#define N 1005
vector<char>ans;
struct node{
int x, y;
char c;
void put(){printf("(%d,%d) : %c\n", x, y, c);}
}a[30];
int step[4][2] = {-1,0, 1,0, 0,-1, 0,1};
int work[100005][2];
char s[N];
int mp[N][N], n, m, k, top, h[N][N], l[N][N];
bool okh(int H, int x, int y){return h[H][y]-h[H][x-1] == 0;}
bool okl(int L, int x, int y){return l[L][y]-l[L][x-1] == 0;}
bool ok(int x, int y, int i, int j){
if(x>i)swap(x,i); if(y>j)swap(y,j);
if(x==i)
return okh(x, y, j);
else
return okl(y, x, i);
}
bool inmap(int x, int y){return 1<=x&&x<=n&&1<=y&&y<=m;}
bool judge(int x, int y){
for(int i = 0; i < k; i++) {
int ux = step[work[i][0]][0] * work[i][1] + x, uy = step[work[i][0]][1] *work[i][1] + y;
if(!inmap(ux,uy))return false;
if(!ok(x, y, ux, uy))return false;
x = ux; y = uy;
}
return true;
}
void debug(){for(int i = 0; i < top; i++)a[i].put();}
void solve(){
// debug();
ans.clear();
for(int i = 0; i < top; i++)
if(judge(a[i].x, a[i].y))
ans.push_back(a[i].c);
if(ans.size()==0){
puts("no solution");
return ;
}
sort(ans.begin(), ans.end());
for(int i = 0; i < ans.size(); i++)printf("%c",ans[i]);
puts("");
}
void input(){
top = 0;
memset(mp, 0, sizeof mp);
memset(h, 0, sizeof h);
memset(l, 0, sizeof l);
for(int i = 1; i <= n; i++){
scanf("%s", s+1);
for(int j = 1; j <= m; j++)
{
if(s[j]=='#')
{
mp[i][j] = 1;
h[i][j] = 1;
l[j][i] = 1;
}
else if('A'<=s[j] && s[j]<='Z'){
a[top].x = i; a[top].y = j; a[top].c = s[j];
top++;
}
}
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
h[i][j] += h[i][j-1];
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
l[i][j] += l[i][j-1];
scanf("%d",&k);
for(int i = 0; i < k; i++){
scanf("%s %d", s, &work[i][1]);
if(s[0] == 'N') work[i][0] = 0;
else if(s[0]=='S') work[i][0] = 1;
else if(s[0]=='W') work[i][0] = 2;
else work[i][0] = 3;
}
}
int main(){
while(~scanf("%d %d",&n,&m)){
input();
solve();
}
return 0;
}

版权声明:本文博主原创文章。博客,未经同意不得转载。

最新文章

  1. (原创)微信支付SDK调用的核心代码与分析(基于Android)
  2. 分享一段数据库中表数据更新SQL
  3. JAVA可阻塞队列-ArrayBlockingQueue
  4. JavaScript 跳坑指南
  5. 多个Storyboard的使用
  6. Centos7上使用官方YUM源安装Mysql
  7. MySQL锁监视器
  8. vijosP1285 佳佳的魔法药水
  9. 洛谷 P1331 海战
  10. django删除migrations
  11. css学习知识点
  12. 浙大pat 1054 题解
  13. Java面试07|Redis数据库
  14. HDU1792A New Change Problem(GCD规律推导)
  15. Node.js学习笔记(四): 全局对象
  16. 面试真题--------spring源码解析IOC
  17. 项目Alpha冲刺(团队)-代码规范、冲刺任务与计划
  18. P4702 取石子
  19. CODEVS 2455 繁忙的都市 SCOI2005(洛谷 P2330)
  20. 10款基于jquery的web前端动画特效

热门文章

  1. vue使用(二)
  2. Lucene 查询方式
  3. js的AJAX请求有关知识总结
  4. loadrunner--分析图合并
  5. ZJOI2002昂贵的聘礼题解
  6. thinkphp5最最最最简单的ajax实例
  7. ARCGIS动态画点
  8. [TypeScript] Creating a Class in TypeScript
  9. hdu 1506 Largest Rectangle in a Histogram ((dp求最大子矩阵))
  10. 你说你会C++? —— 智能指针