HNU暑假训练第一场C.Ninja Map
一、题目大意
Intersections of Crossing Path City are aligned to a grid. There are N east-west streets which are numbered from 1 to N, from north to south. There are also N north-south streets which are numbered from 1 to N, from west to east. Every pair of east-west and north-south streets has an intersection; therefore there are N2 intersections which are numbered from 1 to N2.
Surprisingly, all of the residents in the city are Ninja. To prevent outsiders from knowing their locations, the numbering of intersections is shuffled.
You know the connections between the intersections and try to deduce their positions from the information. If there are more than one possible set of positions, you can output any of them.
对于一个矩阵,给出矩阵中每个节点之间的相互连接关系,要求还原矩阵。
二、思路
观察可得,对于任意一个矩阵,四个拐角处的元素都有一个特点——度为2。因此可以考虑,从外向里一圈一圈的放置元素,在一轮放置结束后,将其他节点的度作相应调整——所有与本轮中放置的节点相关联的节点度数减一。
则可以得到新的拐角元素。对于每一层,都可以枚举度小于2<考虑奇数宽度最中间的一个元素度为0>的元素的起始位置。则也因此可以由节点开始遍历本层元素。
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<stack>
#include<vector>
#include<string>
#include<string.h>
#include<queue>
using namespace std; #define ll intmax_t
#define pp pair<int,int>
#define veci vector<int> const int MAXN=;
int mapp[MAXN][MAXN];
pp coors[MAXN*MAXN];
int n,summ,s_ele;
int du[MAXN*MAXN];
veci G[MAXN*MAXN];
veci que; int addx[]={,,,-};
int addy[]={,,-,}; void show()
{
for(int i=;i<n;++i)
{
for(int j=;j<n;++j)
{
cout<<mapp[i][j];
if(j == n-)cout<<endl;
else cout<<" "; }
}
} void mark(int now,int x,int y)
{
que.push_back(now);
coors[now] = make_pair(x,y);
mapp[x][y] = now;
summ--;
} bool check_legal(int x,int y,int now)
{
int len = G[now].size(); if(x<||x>=n||y<||y>=n)return false;
if(mapp[x][y] != -)return false; for(int i=;i<;++i)
{
int tx = x + addx[i];
int ty = y + addy[i];
if(tx<||tx>=n||ty<||ty>=n)continue;
if(mapp[tx][ty] == -)continue;
bool succ = ;
for(int j=;j<len;++j)
{
int tar = G[now][j];
if(mapp[tx][ty] == tar)
{
succ = ;
break;
}
}if(!succ)return false;
}return true;
} void set_first(int now,int dep)
{
int d1 = dep;
int d2 = n--dep;
int x[] = {d1,d1,d2,d2};
int y[] = {d1,d2,d1,d2};
for(int i=;i<;++i)
{
if(check_legal(x[i],y[i],now))
{
mark(now,x[i],y[i]);
break;
}
}
} bool check_dep(int x,int y,int dep)
{
if(x<||x>=n||y<||y>=n)return false;
int d1 =dep;
int d2 = n--dep;
return x == d1 || x == d2 || y == d1 || y == d2;
} void dfs(int now,int dep)
{
// cout<<now<<endl;
int x = coors[now].first;
int y = coors[now].second;
pp next_coors[];
for(int i=;i<;++i)
{
next_coors[i] = make_pair(x+addx[i],y+addy[i]);
}
int len = G[now].size();
for(int i=;i<len;++i)
{
int tar = G[now][i];
if(coors[tar].first != -)continue;
if(du[tar]==)continue;
for(int j=;j<;++j)
{
int tx = next_coors[j].first;
int ty = next_coors[j].second;
if(check_dep(tx,ty,dep)&&check_legal(tx,ty,tar))
{
mark(tar,tx,ty);
dfs(tar,dep);
break;
}
}
}
} void flush_du()
{
int len = que.size();
for(int i=;i<len;++i)
{
int now = que[i];
int len1 = G[now].size();
for(int j = ;j<len1;++j)
{
int tar = G[now][j];
du[tar] -- ;
if(du[tar] == )s_ele = tar;
}
}
} void init()
{
memset(mapp,-,sizeof(mapp));
int len = *n*n -*n;
for(int i=;i<len;++i)
{
int a,b;
cin>>a>>b;
G[a].push_back(b);
G[b].push_back(a);
}
summ = len = n*n;
for(int i=;i<=len;++i)
{
coors[i] = make_pair(-,-);
du[i] = G[i].size();
if(du[i] == )s_ele = i;
}
int dep = ;
while(summ )
{
que.clear();
set_first(s_ele,dep);
dfs(s_ele,dep);
flush_du();
dep ++;
}
show();
} int main()
{
cin.sync_with_stdio(false);
while(cin>>n)init(); return ;
}
HNU暑假训练第一场C.Ninja Map的更多相关文章
- 19暑假多校训练第一场-J-Fraction Comparision(大数运算)
链接:https://ac.nowcoder.com/acm/contest/881/J来源:牛客网 题目描述 Bobo has two fractions xaxa and ybyb. He wan ...
- Gym-101653:acific Northwest Regional Contest (2019训练第一场)
本套题没有什么数据结构题,图论题,唯一有价值的就是Q题博弈,在最后面,读者可以直接拉到最下面. (还剩下两个,估计每什么价值的题,懒得补了 M .Polyhedra pro:欧拉公式,V-E+F=2: ...
- 大家一起做训练 第一场 E Number With The Given Amount Of Divisors
题目来源:CodeForce #27 E 题目意思和题目标题一样,给一个n,求约数的个数恰好为n个的最小的数.保证答案在1018内. Orz,这题训练的时候没写出来. 这道题目分析一下,1018的不大 ...
- 大家一起做训练 第一场 B Tournament
题目来源:CodeForce #27 B 有n个人比赛,两两之间都有一场比赛,一共 n * (n - 1) / 2 场比赛.每场比赛的记录方式是 a b,表示在a和b的比赛中,a胜出,b失败. 经过研 ...
- 牛客网多校训练第一场 I - Substring(后缀数组 + 重复处理)
链接: https://www.nowcoder.com/acm/contest/139/I 题意: 给出一个n(1≤n≤5e4)个字符的字符串s(si ∈ {a,b,c}),求最多可以从n*(n+1 ...
- 牛客网多校训练第一场 D - Two Graphs
链接: https://www.nowcoder.com/acm/contest/139/D 题意: 两个无向简单图都有n(1≤n≤8)个顶点,图G1有m1条边,图G2有m2条边,问G2有多少个子图与 ...
- HDU 4869 Turn the pokers (2014多校联合训练第一场1009) 解题报告(维护区间 + 组合数)
Turn the pokers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 2015多校联合训练第一场Tricks Device(hdu5294)
题意:给一个无向图,给起点s,终点t,求最少拆掉几条边使得s到不了t,最多拆几条边使得s能到t 思路: 先跑一边最短路,记录最短路中最短的边数.总边数-最短边数就是第二个答案 第一个答案就是在最短路里 ...
- SDU暑假排位第一场 (Gym - 100889)
啊今天有点挂机啊 D题和队友暴力后发现一组数据跑得飞快 然后遇上1e5组数据就没了..... 然后我疯狂优化暴力 然后去世了 最后半小时F也没写出来 主要还是最后有点慌并且没有考虑清楚 导致情况越写越 ...
随机推荐
- (开发)bable - es6转码
参考:http://www.ruanyifeng.com/blog/2016/01/babel.html Babel Babel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执 ...
- vue2 数据交互 vue-resource
1.安装vue-resource到项目中,找到当前项目 输入:npm install vue-resource --save 2.安装完毕后,在main.js中导入,如下所示: import Vue ...
- HTML头部元素实例
HTML head 元素 标签 描述 <head> 定义了文档的信息 <title> 定义了文档的标题 <base> 定义了页面链接标签的默认链接地址 <li ...
- vos优化客户线路数量
问题: 客户A打电话过来说之前给开的300线路不够用了,今天好多电话呼不出去了,线路太挤了! 麻烦增加线路,如何操作? 方法: 登陆VOS——在线对接——(客户A的对接网关ID)——双击 打开网关管理 ...
- wxWidgets窗口类型
如果在创建窗口的时候你没有指定窗口的边框类型,那么在不同的平台上将会有不同的边框类型的缺省值.在windows平台上,控件边框的缺省值为 wxSUNKEN_BORDER,意为使用当前系统风格的边框.你 ...
- SAP CRM WebClient UI和Fiori UI混搭并存
SAP CRM里有个功能可以创建HANA live report,消费HANA Studio里创建的模型. 最后创建好的report长这个样子: 具体创建步骤可以参考我的博客Step by Step ...
- IOS中 copy ,strong ,weak ,assign使用区别
.@property属性的用法 * weak(assign) : 代理\UI控件 * strong(retain) : 数组.模型)其他对象(除代理\UI控件\字符串以外的对象) * copy ...
- hdu-2609 How many---最小表示法模板+set判重
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2609 题目大意: 有n个有01组成的字符串,每个字符串都代表一个项链,那么该字符串就是一个环状的结构 ...
- 【BZOJ4555】[TJOI2016&HEOI2016] 求和(NTT)
点此看题面 大致题意: 计算\(\sum_{i=0}^n\sum_{j=0}^iS(i,j)*2^j*(j!)\),其中\(S\)为第二类斯特林数. 推式子 首先让我们来推一波式子: 因为当\(i&l ...
- css3阴影 box-shadow
语法 box-shadow:X轴偏移量 y轴偏移量 [阴影模糊半径] [阴影扩展半径] [阴影颜色] [投影方式] 参数介绍: 注:inset 可以写在参数的第一个或最后一个,其它位置是无效的. 阴影 ...