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也没写出来 主要还是最后有点慌并且没有考虑清楚 导致情况越写越 ...
随机推荐
- iOS - The identity used to sign the executable is no longer valid
①.首先在xcode中的Build Settings中看有没有设置: ②.账号是不是多个人在用,个人开发者的账号只能绑定一台电脑,当另外一台电脑绑定了话,你的电脑就失效了.你确认下是不是这个原因造成的 ...
- springboot利用mail配置包,实现邮件发送
了解邮件发送与接收的过程: A->S1->S2->B 1.计算机A通过SMTP协议将邮件发送到服务器S1上: 2.服务器S1再发送到服务器S2: 3.计算机B通过POP3协议接收服务 ...
- 【Node.js】Stream(流)的学习笔记
最近学习使用Node.js创建http proxy server,少不了要跟Stream打交道.昨天开始查阅一些资料,多少有了一些粗浅了解.整理在这里,供学习之用. 从Node.js API文档中可知 ...
- 夜色的 cocos2d-x 开发笔记 00
第一次写博客,本人还是大二学生,纯新手,无论是文章的技术性,还是参考性,都不高,但却是根据我的经历,开发过的真实过程,对自己记载一些备忘的笔记,更希望也能帮到一些人. 本人用的win7 + vs201 ...
- 【MATLAB】产生FPGA中ROM需要的余弦表
产生的二进制数为带符号二进制数,最高位是符号位. function [ DATA ] = cos_gen( Num_addr,Num_out ) % 用来产生ROM需要的余弦表,输出为有符号二进制数 ...
- 关于 supersocket 不能通过Bootstrap 启动
App.config内容 <configSections> <section name="superSocket" type="SuperSocke ...
- Asp.Net实现伪静态(通过URLRewriter)
一.起因 最近一个项目要实现伪静态,之前没接触过,故一切从零开始,开始网上查资料,方法大概有三种,但是我都试了好几个,都失败了.望有建议的博友给点建议,这里我实现了一种方式,是通过微软URLRewri ...
- Html : 点击按钮弹出输入框,再次点击进行隐藏
上代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly.错误
错误如图示: 1.在php的目录下建立个文件夹tmp,这个有权限的问题,如果是ntfs的分区,就一定要添加evryone的控制权限,否则是没用的.2.在php.ini找到session.save_pa ...
- LA 2957 最大流,最短时间,输出路径
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=1 ...