test20181102 空间复杂度 和 test20181030 数独
空间复杂度
考场做法
前有时间复杂度,后有空间复杂度。
但是这题不会有CE情况,所以较为好写。
就用map存复杂度,单层循环就搞定了。
至于判断维度的方法,我是用快读从字符串中读入。
然后不管常数,把所有的n都变成0,判断有几个0就好了。
using namespace std;
map<string,int>M;
char opt[MAXL];
char name[MAXL];
int maxcomp,curcomp;
int main()
{
freopen("complexity.in","r",stdin);
freopen("complexity.out","w",stdout);
M["i"]=0;
while(~scanf("%s",opt))
{
if(opt[0]=='S')
{
scanf("%s",name);
maxcomp=0;
}
else if(opt[0]=='E')
{
M[name]=maxcomp;
// cerr<<name<<" comp="<<maxcomp<<endl;
}
else
{
curcomp=M[opt];
// cerr<<" "<<opt<<" comp="<<curcomp<<endl;
fgets(buf,MAXL,stdin);
len=strlen(buf);
buf[--len]=0;
p=0;
for(int i=0;i<len;++i)
if(buf[i]=='n')
buf[i]='0';
while(p<len)
{
int mul=read<int>();
// cerr<<" mul="<<mul<<endl;
if(mul==0)
++curcomp;
}
maxcomp=max(maxcomp,curcomp);
}
}
int ans=0;
for(map<string,int>::iterator i=M.begin();i!=M.end();++i)
ans=max(ans,i->second);
if(ans==0)
{
puts("O(1)");
}
else if(ans==1)
{
puts("O(n)");
}
else
{
printf("O(n^%d)\n",ans);
}
return 0;
}
标解
这东西是用markdown写的,底色挺好看,不知道怎么弄的。
#include <bits/stdc++.h>
#define For(i, l, r) for(register int i = (l), i##end = (int)(r); i <= i##end; ++i)
using namespace std;
template<typename T> inline bool chkmin(T &a, T b) {return b < a ? a = b, 1 : 0;}
template<typename T> inline bool chkmax(T &a, T b) {return b > a ? a = b, 1 : 0;}
inline int read() {
int x(0), sgn(1); char ch(getchar());
for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;
for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
return x * sgn;
}
void File() {
freopen ("complexity.in", "r", stdin);
freopen ("complexity.out", "w", stdout);
}
map<string, int> M;
int ans = 0; string str;
int main () {
File();
M["i"] = 0;
int ans = 0;
while (cin >> str) {
int maxv = 0;
string name; cin >> name;
while (cin >> str) {
if (str[0] == 'E') break;
int cur = M[str];
cin >> str;
For (j, 0, str.size() - 1)
if (str[j] == 'n') ++ cur;
chkmax(maxv, cur);
}
chkmax(ans, maxv);
M[name] = maxv;
}
if (ans == 0) return puts("O(1)"), 0;
if (ans == 1) return puts("O(n)"), 0;
printf ("O(n^%d)\n", ans);
return 0;
}
std直接找n有几个……我还是太年轻了。
数独
输入格式
输入的前 19 行为一个二维字符数组,为数独的初始状态的方阵格式。
随后一行一个整数 T 表示操作的次数。
随后 T 行,每行为下列形式:
- Insert x y k,表示在(x, y)位置插入数 k。
- Delete x y,表示删除(x, y)位置的数。
- Query x y,表示查询(x, y)位置能填入且不会出现冲突的数。
- Merge i j,表示合并第 i 次操作后的状态和第j 次操作后的状态。
- Print,表示查询整个数独的状态。
其中 x 表示行数,从上到下分别为 1 到 9,y 表示列数,从左到右分别为 1到 9。
输出格式
对于每个操作,你需要按照题目描述进行对应的输出。
样例输入输出 1
见题目目录下的 1.in 与 1.ans。
样例输入输出 2
见题目目录下的 2.in 与 2.ans。
该样例的数据规模与第 6 / 7 个测试点相同。
数据规模与约定
所有测试点的数据规模与约定如下:
对于所有的数据,\(1 \leq T \leq 100,1 \leq x, y,k \leq 9\),对于第 a 个操作,若是Merge操作,则\(1 \leq i, j <a\)。保证第一个操作不是 Merge操作。
对于所有的数据,均可能存在查询整个数独的操作,且保证初始状态不存在冲突。
分析
照题目模拟即可。
下标从0开始判同九宫格会很好写。
封装check函数会让代码简洁很多。
#include<iostream>
#include<cstdio>
#include<cstring>
template<class T>T read(T&x)
{
T data=0;
char ch=getchar();
while(!isdigit(ch))
{
ch=getchar();
}
while(isdigit(ch))
{
data=data*10+ch-'0';
ch=getchar();
}
return x=data;
}
using namespace std;
const int MAXN=150;
int n,a[20];
struct Soduku
{
int data[9][9];
void init()
{
memset(data,0,sizeof data);
}
Soduku()
{
init();
}
int*operator[](const int&x)
{
return data[x];
}
int chk(int x,int y,int k) // x-1,y-1
{
if(data[x][y]) // err
{
return 1;
}
for(int i=0;i<9;++i)
if(data[x][i]==k) // row
{
return 2;
}
for(int i=0;i<9;++i)
if(data[i][y]==k) // col
{
return 3;
}
int r=x/3,c=y/3;
for(int i=r*3;i<(r+1)*3;++i)
for(int j=c*3;j<(c+1)*3;++j)
if(data[i][j]==k)
{
return 4; // squ
}
return 0; // ok
}
void ins(int x,int y,int k) // x-1,y-1
{
int stat=chk(x,y,k);
if(stat==1)
{
puts("Error!");
return;
}
else if(stat==2)
{
puts("Error:row!");
return;
}
else if(stat==3)
{
puts("Error:column!");
return;
}
else if(stat==4)
{
puts("Error:square!");
return;
}
else
{
puts("OK!");
data[x][y]=k;
}
}
void del(int x,int y) // x-1,y-1
{
if(!data[x][y])
{
puts("Error!");
return;
}
puts("OK!");
data[x][y]=0;
}
void quiz(int x,int y) // x-1,y-1
{
if(data[x][y])
{
puts("Error!");
return;
}
n=0;
for(int k=1;k<=9;++k) // try i
{
if(chk(x,y,k)==0)
a[++n]=k;
}
printf("%d\n",n);
for(int i=1;i<=n;++i)
printf("%d\n",a[i]);
}
Soduku operator+(const Soduku&rhs)const
{
Soduku res;
int icnt=0,jcnt=0; // edit 1
for(int i=0;i<9;++i)
for(int j=0;j<9;++j)
{
if(data[i][j]&&res.chk(i,j,data[i][j])==0)
{
res.data[i][j]=data[i][j];
++icnt;
continue;
}
if(rhs.data[i][j]&&res.chk(i,j,rhs.data[i][j])==0)
{
res.data[i][j]=rhs.data[i][j];
++jcnt;
continue;
}
}
printf("%d %d\n",icnt,jcnt);
return res; // eidt 2
}
void out()
{
for(int i=0;i<9;++i)
{
puts("+-+-+-+-+-+-+-+-+-+");
for(int j=0;j<9;++j)
printf("|%d",data[i][j]);
printf("|\n");
}
puts("+-+-+-+-+-+-+-+-+-+");
}
}S[MAXN];
int main()
{
freopen("sudoku.in","r",stdin);
freopen("sudoku.out","w",stdout);
for(int i=0;i<9;++i)
for(int j=0;j<9;++j)
read(S[0][i][j]);
int T;
read(T);
// cerr<<"T="<<T<<endl;
char opt[20];
int x,y,k;
for(int i=1;i<=T;++i)
{
S[i]=S[i-1];
scanf("%s",opt);
if(opt[0]=='I') // Insert x y k
{
read(x);read(y);read(k);
--x,--y;
S[i].ins(x,y,k);
}
else if(opt[0]=='D') // Delete x y
{
read(x);read(y);
--x,--y;
S[i].del(x,y);
}
else if(opt[0]=='Q') // Query x y
{
read(x);read(y);
--x,--y;
S[i].quiz(x,y);
}
else if(opt[0]=='M') // Merge i j
{
read(x);read(y);
S[i]=S[x]+S[y];
}
else if(opt[0]=='P') // Print
{
S[i].out();
}
// cerr<<i<<" S="<<endl;
// S[i].out();
}
return 0;
}
test20181102 空间复杂度 和 test20181030 数独的更多相关文章
- 【leetcode】sudokuSolver数独解题
0.摘要 小时候在报纸上玩过数独,那时候觉得很难,前几天在leetcode上遇到了这个题,挺有意思于是记录下来 一般一道数独题,就像他给的例子这样,9*9的格子,满足 行,列 ,宫均取1-9的数,切互 ...
- 一次数独生成及解题算法的剖析(Java实现)
数独生成及解题算法剖析(Java实现) 关键词 数独9x9 数独生成算法 数独解题算法 序言 最近业务在巩固Java基础,编写了一个基于JavaFX的数独小游戏(随后放链接).写到核心部分发现平时玩的 ...
- LintCode389.判断数独是否合法
LintCode简单题:判断数独是否合法 问题描述: 请判定一个数独是否有效. 该数独可能只填充了部分数字,其中缺少的数字用 . 表示. 注意事项: 一个合法的数独(仅部分填充)并不一定是可解的.我们 ...
- [LeetCode] Sudoku Solver 求解数独
Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...
- [LeetCode] Valid Sudoku 验证数独
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...
- 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...
- 数独 JAVA实现
数独游戏的规则从很久之前就知道,但是一直都没怎么玩过,然后到了大学,大一下学期自己学dfs的时候,刚刚好碰到了一个数独的题目,做出来后,感觉还是挺有成就感的 然后大二学了JAVA,看了下那个一些有关于 ...
- 用C++实现的解数独(Sudoku)程序
我是一个C++初学者,控制台实现了一个解数独的小程序. 代码如下: //"数独游戏"V1.0 //李国良于2016年11月11日编写完成 #include <iostream ...
- ACM : POJ 2676 SudoKu DFS - 数独
SudoKu Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu POJ 2676 Descr ...
随机推荐
- 使用mysql连接django时,需要的步骤以及错误解决办法
django默认使用的sqlite3,更改为SQL时需要按照如下操作进行 1.在settings.py中的78行进行更改 DATABASES = { 'default': { 'ENGINE': 'd ...
- KVM虚拟机两种配置的概念不同之处
KVM虚拟机配置的两种方式之间的不同之处 NAT方式 NAT模式中,让虚拟机借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网. NAT模式中,虚拟机的网卡和物理网卡的网络,不在同一个网 ...
- SELinux安全子系统的学习
SELinux(Security-Enhanced Linux)是美国国家安全局在 Linux 开源社区的帮助下开发的 一个强制访问控制(MAC,Mandatory Access Control)的安 ...
- 用pytorch1.0搭建简单的神经网络:进行回归分析
搭建简单的神经网络:进行回归分析 import torch import torch.nn.functional as F # 包含激励函数 import matplotlib.pyplot as p ...
- flex左右布局 左边固定 右侧自适应
flex左右布局 左边固定 右侧自适应 想要保证自适应内容不超出容器怎么办. 通过为自适应的一侧设置width: 0;或者overflow: hidden;解决. 首先实现标题的布局,也很简单: &l ...
- (未完成)ARM-linux 移植 SDL
ref : https://blog.csdn.net/u012075739/article/details/24877639 2. 交叉编译SDL 编译SDL前先要编译其依赖库 tsl ...
- Electron-vue中通过WebAudioApi实现录音功能,并转换为mp3格式,实时监测音频设备变化
实现以下功能: 1.检测当前音频环境,是否支持录音(WebAudio Api): 2.获取输入.输出设备列表,获取电脑默认的音频设备: 3.试音功能,通过分析录音样本数据,判断是否录到声音: 4.实时 ...
- Linux下如何挂载文件,并设置开机自动挂载
首先保证服务端安装了 查看是否安装命令: nfsstat yum install nfs-utils 安装nfs-utils 192.168.50.85(服务端)192.168.50.83(客户端) ...
- @app.route源码流程分析
@app.route(), 是调用了flask.app.py文件里面的Flask类的route方法,route方法所做的事情和add_url_rule类似,是用来为一个URL注册一个视图函数,但是我们 ...
- 我对xss以及sql的理解
我对xss以及sql的理解 本文作者:情殇(查看作者所有博文) 作者邮箱:3135117931@qq.com 发布时间: Fri, 12 Jul 2019 19:16:00 +0800 Xss和sql ...