题目链接:点击查看

题目大意:给出一个 n * n 的矩阵,初始时每个格子都为空,现在要求我们自己用 ' R ' , ' L ' , ' U ' , ' D ' 和 ' X ' 填充,分别表示在每个格子必须完成的指令,前四个分别为方向指令,代表着需要向指定的方向移动一个单位,而 ' X ' 代表终点,在这个点必须停下来,而在移动的过程中,不许越界,问能否找到一种构造方案,使得每个格子最终都能到达指定的格子,-1 -1 代表无限循环

题目分析:其实光考虑格子的属性,我们可以分为三种,一种是无限循环的,一种是终点,还有一种就是正常的路了,对于无限循环,第一反应应该是找到一个环,但后来反应过来了,我们只需要找到找到相邻的两个无限循环的格子,让其对起来这两个格子就形成一个最小的环了,与这两个格子直接相连的所有无限循环,都可以沿着路径到达这两个格子,这就是我处理无限循环的方法,剩下的就是关于 ‘ X ’ ,因为 ' X ' 可以视为终点,各个其他的点汇集而来的点,我们只需要从这个点出发,将沿路需要到达该点的所有点都连接过来就好了,经过上述两个操作后,矩阵中的所有点应该都有了一个确定的赋值,此时检查一遍,如果仍然有空缺,那就说明无解了,否则该矩阵就是答案了

比较简单的一道构造题,我感觉dfs写起来比bfs要简单不少,因为每个点至多遍历一遍,所以时间复杂度为O(n*n)

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e3+100;const int b[4][2]={0,1,0,-1,1,0,-1,0};const char pos[4]={'L','R','U','D'};int n;struct Node
{int x,y;char ch;
}point[N][N];void dfs1(int x,int y)//处理无限循环
{for(int i=0;i<4;i++){int xx=x+b[i][0];int yy=y+b[i][1];if(xx<=0||yy<=0||xx>n||yy>n)continue;if(point[xx][yy].ch!='T')continue;point[xx][yy].ch=pos[i];dfs1(xx,yy);}
}void dfs2(int x,int y,int sx,int sy)//处理正常的路
{for(int i=0;i<4;i++){int xx=x+b[i][0];int yy=y+b[i][1];if(xx<=0||yy<=0||xx>n||yy>n)continue;if(point[xx][yy].ch!='C')continue;if(point[xx][yy].x==sx&&point[xx][yy].y==sy){point[xx][yy].ch=pos[i];dfs2(xx,yy,sx,sy);}}
}bool check()
{for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(point[i][j].ch=='T'||point[i][j].ch=='C')return false;return true;
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);scanf("%d",&n);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){scanf("%d%d",&point[i][j].x,&point[i][j].y);if(point[i][j].x==i&&point[i][j].y==j)//终点point[i][j].ch='X';else if(point[i][j].x==-1&&point[i][j].y==-1)//无限循环point[i][j].ch='T';else//正常的路point[i][j].ch='C';}for(int x=1;x<=n;x++)//处理无限循环 for(int y=1;y<=n;y++)if(point[x][y].ch=='T')for(int k=0;k<4;k++){int xx=x+b[k][0];int yy=y+b[k][1];if(xx<=0||yy<=0||xx>n||yy>n)continue;if(point[xx][yy].ch=='T'){point[x][y].ch=pos[k^1];point[xx][yy].ch=pos[k];dfs1(x,y);dfs1(xx,yy);}}for(int x=1;x<=n;x++)//处理制定路径for(int y=1;y<=n;y++)if(point[x][y].ch=='X')dfs2(x,y,x,y);if(!check())puts("INVALID");else{puts("VALID");for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)putchar(point[i][j].ch);putchar('\n');}}return 0;
}

CodeForces - 1316D Nash Matrix(构造+dfs)相关推荐

  1. CodeCraft-20 (Div. 2) D. Nash Matrix 构造 + dfs

    传送门 文章目录 题意: 思路: 题意: 给定一个n∗nn*nn∗n的矩阵,每个点上面都有一个xi,yix_i,y_ixi​,yi​,表示这个点到xi,yix_i,y_ixi​,yi​这个点停下,当x ...

  2. HDU 多校 6400 Parentheses Matrix(构造)

    HDU 多校 6400 Parentheses Matrix(构造) // Problem: D. Parentheses Matrix // Contest: Codeforces - 2018 C ...

  3. CodeForces - 1332 D. Walk on Matrix 构造

    CodeForces - 1332 D. Walk on Matrix 题目地址: http://codeforces.com/contest/1332/problem/D 基本题意: 给出上面这个动 ...

  4. A/B Matrix CodeForces - 1360G(思维构造)

    You are given four positive integers n, m, a, b (1≤b≤n≤50; 1≤a≤m≤50). Find any such rectangular matr ...

  5. Codeforces Round #453 (Div. 1) D. Weighting a Tree 构造 + dfs树

    传送门 文章目录 题意: 思路: 题意: 给你一颗nnn个点的图,每个点都有一个点权cic_ici​,要求你给每个边赋一个权值kik_iki​,要求对于每个点与他相连的边的权值之和等于这个点的点权ci ...

  6. CodeForces - 1332D Walk on Matrix(构造)

    题目链接:点击查看 题目大意:给出一个错误的dp程序,目的是为了求从点 ( 1 , 1 ) 到点 ( n , m ) 只能向下移动或向右移动,找出一条路径,使得 与运算 的结果最大,给出一个 k ,构 ...

  7. CodeForces - 468C Hack it!(构造+数位dp)

    题目链接:点击查看 题目大意:求出一段区间 [l,r][l,r][l,r] 的数位和对 aaa 取模后为 000.更具体的,设 f(x)f(x)f(x) 为 xxx 的数位和,本题需要求出一对 [l, ...

  8. Codeforces 846 B Math Show DFS + 贪心

    题目链接: http://codeforces.com/contest/846/problem/B 题目描述: 有N个节点, 每个节点有相同的K个子节点, 每个子节点有时间花费,完成一个子节点获得1分 ...

  9. 图论 ---- 构造DFS树的思想 K - Boomerangs Gym - 102001K

    题目链接 题目大意: 解题思路: 启发性思考首先我们先图切成dfs树,然后给图一个稳定结构之后,我们就可以去构造了 对于每个点我们从第底端开始构造每次把每次点的儿子两两匹配,如果是奇数个儿子就把多出来 ...

最新文章

  1. 将图片读取为像素格式
  2. 「 Luogu P2420 」 让我们异或吧
  3. 细分领域继续进击,海尔电器寻退市增效?
  4. mysql导出单表数据
  5. Eclipse和Tomcat绑定并且将上传资源到Tomcat上
  6. linux命令之awk终极系列
  7. rio indy_RIO Journal是否会成为同类中最开放的?
  8. java jaxb 集合_java-使用JAXB解组/编组List String
  9. NB朴素贝叶斯理论推导与三种常见模型
  10. java api接口签名验证失败_cryptapi结合java进行数字签名与验证签名的困惑
  11. 2020-09-14 编译Qt的MySQL 5.7插件: qsqlmysql.dll
  12. Inside the Linux Operating System[1]
  13. ubuntu上matlab2014a修改成windows方式快捷键
  14. 数据库MDF数据文件数据库恢复
  15. IDEA 打包docker镜像
  16. [中文/英文]VC6 sp6补丁下载|VS6 sp6补丁下载 [防VC6link死机]
  17. xyz坐标转换ybc_GNSS仰角和方位角的计算及代码,XYZ转BLH坐标的代码及原理
  18. C++【STL】【string类的使用】
  19. 雇佣兵问题(Python解答)
  20. 【Office文档在线编辑和预览服务搭建】

热门文章

  1. MySQL子查询介绍
  2. 基于命令行设置lazy-queue
  3. mybatis-Batch Executor
  4. MapReduce-流量统计求和-分区代码实现
  5. 通过docker的方式进行RocketMQ的安装
  6. ReactJS入门之前端开发的演变
  7. 角色管理与今日内容介绍
  8. ES6新特性之map和reduce方法的使用
  9. 数据库-表中导入数据-insert
  10. 设计模式之_Iterator_05