痛苦

题目

数 独

【问题描述】

给定一个9*9矩阵,对其进行几种操作,分别是插入,删除,合并,查询,输出

主要学到了一些特别的操作。

(1)备份( 本蒟蒻第一次了解到)

(2)对与数据的一些特别的改动

(3)进行标记

这道题目,直接模拟就可以了,但要注意细节以及一些很妙的操作:

首先是字符组的存入:注意将其他的字符进行排除:

1 for(int i=1;i<=19;i++){
2 cin>>s;
3 if(i&1)continue;//奇数
4 for(int j=1;j<=9;j++)
5 c[0][i/2][j]=s[j*2-1];
6 }

然后就是分类讨论:

char c[105][10][10];//前面用于备份每一次操作后的数独(第一次看到这种操作,太强了)
cin>>T;
for(int i=1;i<=T;i++){
cin>>s;
if(s[0]=='I')x=in,y=in,k=in,insert(i,x,y,k);//in:快读{i记录每一次操作}
else if(s[0]=='D')x=in,y=in,del(i,x,y);
else if(s[0]=='Q')x=in,y=in,query(i,x,y);
else if(s[0]=='M')x=in,y=in,merge(i,x,y);
else print(i);
}

1:插入:

 1 void insert(int n,int x,int y,int k){
2 for(int i=1;i<=9;i++)
3 for(int j=1;j<=9;j++)
4 c[n][i][j]=c[n-1][i][j];//备份
5 if(c[n][x][y]!='0'){
6 cout<<"Error!"<<endl;
7 return;
8 }
9 for(int i=1;i<=9;i++)
10 if(c[n][x][i]==k+'0'){
11 cout<<"Error:row!"<<endl;
12 return;//冲突1
13 }
14 for(int i=1;i<=9;i++)
15 if(c[n][i][y]==k+'0'){
16 cout<<"Error:column!"<<endl;
17 return;//冲突2
18 }
19 int gg=(x-1)/3*3+(y-1)/3+1;
20 for(int i=0;i<=2;i++)
21 for(int j=0;j<=2;j++)
22 if(c[n][i+xs[gg]][j+ys[gg]]==k+'0'){
23 cout<<"Error:square!"<<endl;
24 return;//冲突3
25 }
26 cout<<"OK!"<<endl;
27 c[n][x][y]=k+'0';
28 }

2:删除:

 1 void del(int n,int x,int y){
2 for(int i=1;i<=9;i++)
3 for(int j=1;j<=9;j++)
4 c[n][i][j]=c[n-1][i][j];//注意备份
5 if(c[n][x][y]=='0')
6 cout<<"Error!"<<endl;
7 else{
8 cout<<"OK!"<<endl;
9 c[n][x][y]='0';
10 }
11 }

3:查询:

 1 int can[10],ans;
2 void query(int n,int x,int y){
3 for(int i=1;i<=9;i++)
4 for(int j=1;j<=9;j++)
5 c[n][i][j]=c[n-1][i][j];
6 if(c[n][x][y]!='0'){cout<<"Error!"<<endl;}
7 memset(can,0,sizeof(can));ans=0;
8 int gg=(x-1)/3*3+(y-1)/3+1;
9 for(int i=1;i<=9;i++)
10 can[c[n][x][i]-'0']=1;
11 for(int i=1;i<=9;i++)
12 can[c[n][i][y]-'0']=1;
13 for(int i=0;i<=2;i++)
14 for(int j=0;j<=2;j++)
15 can[c[n][i+xs[gg]][j+ys[gg]]-'0']=1;//记录不满足的数(因为冲突)
16 for(int i=1;i<=9;i++)
17 if(!can[i]) ans++;
18 cout<<ans<<endl;
19 for(int i=1;i<=9;i++)
20 if(!can[i]) cout<<i<<endl;
21 }

4:合并:

 1 int ansx,ansy;
2 void merge(int n,int x,int y){
3 for(int i=1;i<=9;i++)
4 for(int j=1;j<=9;j++){
5 int flag=0;
6 if(c[x][i][j]!='0'){
7 flag=1;
8 for(int k=1;k<=9;k++)
9 if(c[n][i][k]==c[x][i][j]){
10 flag=0;break;
11 }
12 for(int k=1;k<=9;k++)
13 if(c[n][k][j]==c[x][i][j]){
14 flag=0;break;
15 }
16 int wh=(i-1)/3*3+(j-1)/3+1;
17 for(int l=0;l<=2;l++)
18 for(int r=0;r<=2;r++)
19 if(c[n][l+xs[wh]][r+ys[wh]]==c[x][i][j]){
20 flag=0;break;
21 }
22 }
23 if(flag){
24 c[n][i][j]=c[x][i][j];
25 ansx++;
26 continue;
27 }
28 if(c[y][i][j]!='0'){
29 flag=1;
30 for(int k=1;k<=9;k++)
31 if(c[n][i][k]==c[y][i][j]){
32 flag=0;break;
33 }
34 for(int k=1;k<=9;k++)
35 if(c[n][k][j]==c[y][i][j]){
36 flag=0;break;
37 }
38 int wh=(i-1)/3*3+(j-1)/3+1;
39 for(int l=0;l<=2;l++)
40 for(int r=0;r<=2;r++)
41 if(c[n][l+xs[wh]][r+ys[wh]]==c[y][i][j]){
42 flag=0;break;
43 }
44 }
45 if(flag){
46 c[n][i][j]=c[y][i][j];
47 ansy++;
48 continue;
49 }
50 c[n][i][j]='0';
51 }
52 cout<<ansx<<" "<<ansy<<endl;
53 ansx=0,ansy=0;//注意多次操作要恢复
54 }

总代码:

  1 #include<bits/stdc++.h>
2 using namespace std;
3 #define int long long
4 #define in read()
5 inline int read(){
6 int p=0,f=1;
7 char c=getchar();
8 while(!isdigit(c)){
9 if(c=='-')f=-1;
10 c=getchar();
11 }
12 while(isdigit(c)){
13 p=p*10+c-'0';
14 c=getchar();
15 }
16 return p*f;
17 }
18 char c[105][10][10];
19 string s;
20 int xs[10]={0,1,1,1,4,4,4,7,7,7};
21 int ys[10]={0,1,4,7,1,4,7,1,4,7};
22 void insert(int n,int x,int y,int k){
23 for(int i=1;i<=9;i++)
24 for(int j=1;j<=9;j++)
25 c[n][i][j]=c[n-1][i][j];
26 if(c[n][x][y]!='0'){
27 cout<<"Error!"<<endl;
28 return;
29 }
30 for(int i=1;i<=9;i++)
31 if(c[n][x][i]==k+'0'){
32 cout<<"Error:row!"<<endl;
33 return;
34 }
35 for(int i=1;i<=9;i++)
36 if(c[n][i][y]==k+'0'){
37 cout<<"Error:column!"<<endl;
38 return;
39 }
40 int gg=(x-1)/3*3+(y-1)/3+1;
41 for(int i=0;i<=2;i++)
42 for(int j=0;j<=2;j++)
43 if(c[n][i+xs[gg]][j+ys[gg]]==k+'0'){
44 cout<<"Error:square!"<<endl;
45 return;
46 }
47 cout<<"OK!"<<endl;
48 c[n][x][y]=k+'0';
49 }
50 void del(int n,int x,int y){
51 for(int i=1;i<=9;i++)
52 for(int j=1;j<=9;j++)
53 c[n][i][j]=c[n-1][i][j];
54 if(c[n][x][y]=='0')cout<<"Error!"<<endl;
55 else{cout<<"OK!"<<endl;c[n][x][y]='0';}
56 }
57 int can[10],ans;
58 void query(int n,int x,int y){
59 for(int i=1;i<=9;i++)
60 for(int j=1;j<=9;j++)
61 c[n][i][j]=c[n-1][i][j];
62 if(c[n][x][y]!='0'){cout<<"Error!"<<endl;}
63 memset(can,0,sizeof(can));ans=0;
64 int gg=(x-1)/3*3+(y-1)/3+1;
65 for(int i=1;i<=9;i++)
66 can[c[n][x][i]-'0']=1;
67 for(int i=1;i<=9;i++)
68 can[c[n][i][y]-'0']=1;
69 for(int i=0;i<=2;i++)
70 for(int j=0;j<=2;j++)
71 can[c[n][i+xs[gg]][j+ys[gg]]-'0']=1;
72 for(int i=1;i<=9;i++)
73 if(!can[i]) ans++;
74 cout<<ans<<endl;
75 for(int i=1;i<=9;i++)
76 if(!can[i]) cout<<i<<endl;
77 }
78 int ansx,ansy;
79 void merge(int n,int x,int y){
80 for(int i=1;i<=9;i++)
81 for(int j=1;j<=9;j++){
82 int flag=0;
83 if(c[x][i][j]!='0'){
84 flag=1;
85 for(int k=1;k<=9;k++)
86 if(c[n][i][k]==c[x][i][j]){
87 flag=0;break;
88 }
89 for(int k=1;k<=9;k++)
90 if(c[n][k][j]==c[x][i][j]){
91 flag=0;break;
92 }
93 int wh=(i-1)/3*3+(j-1)/3+1;
94 for(int l=0;l<=2;l++)
95 for(int r=0;r<=2;r++)
96 if(c[n][l+xs[wh]][r+ys[wh]]==c[x][i][j]){
97 flag=0;break;
98 }
99 }
100 if(flag){
101 c[n][i][j]=c[x][i][j];
102 ansx++;
103 continue;
104 }
105 if(c[y][i][j]!='0'){
106 flag=1;
107 for(int k=1;k<=9;k++)
108 if(c[n][i][k]==c[y][i][j]){
109 flag=0;break;
110 }
111 for(int k=1;k<=9;k++)
112 if(c[n][k][j]==c[y][i][j]){
113 flag=0;break;
114 }
115 int wh=(i-1)/3*3+(j-1)/3+1;
116 for(int l=0;l<=2;l++)
117 for(int r=0;r<=2;r++)
118 if(c[n][l+xs[wh]][r+ys[wh]]==c[y][i][j]){
119 flag=0;break;
120 }
121 }
122 if(flag){
123 c[n][i][j]=c[y][i][j];
124 ansy++;
125 continue;
126 }
127 c[n][i][j]='0';
128 }
129 cout<<ansx<<" "<<ansy<<'\n';
130 ansx=0,ansy=0;
131 }
132 void print(int n){
133 for(int i=1;i<=9;i++)
134 for(int j=1;j<=9;j++)
135 c[n][i][j]=c[n-1][i][j];
136 for(int i=1;i<=9;i++){
137 cout<<"+-+-+-+-+-+-+-+-+-+"<<endl;
138 for(int j=1;j<=9;j++)
139 cout<<"|"<<c[n][i][j];
140 cout<<"|"<<endl;
141 }
142 cout<<"+-+-+-+-+-+-+-+-+-+\n";
143 }
144 int T,x,y,k;
145 signed main(){
146 for(int i=1;i<=19;i++){
147 cin>>s;
148 if(i&1)continue;//奇数
149 for(int j=1;j<=9;j++)
150 c[0][i/2][j]=s[j*2-1];
151 }
152 T=in;
153 for(int i=1;i<=T;i++){
154 cin>>s;
155 if(s[0]=='I')x=in,y=in,k=in,insert(i,x,y,k);
156 else if(s[0]=='D')x=in,y=in,del(i,x,y);
157 else if(s[0]=='Q')x=in,y=in,query(i,x,y);
158 else if(s[0]=='M')x=in,y=in,merge(i,x,y);
159 else print(i);
160 }
161 return 0;
162 }

2021.11.2-测试T1数独的更多相关文章

  1. 2021.11.4测试T1-妹子

    题目 今天测试,直接挂完了 写了四个小时,最后发现自己题目理解错误了 有两个区间,在输入了 \(l\) 和 \(r\) 以后,进行查询 \[ min(max(a_1,a_2,...a_p,b_{p+1 ...

  2. 日常Javaweb 2021/11/19

    Javaweb Dao层: //连接数据库,实现增查功能 package dao; import java.sql.Connection; import java.sql.DriverManager; ...

  3. 日常Java 2021/11/18

    用idea实现Javaweb登录页面 <%-- Created by IntelliJ IDEA. User: Tefuir Date: 2021/11/18 Time: 18:14 To ch ...

  4. 2021.11.30 eleveni的水省选题的记录

    2021.11.30 eleveni的水省选题的记录 因为eleveni比较菜,eleveni决定先刷图论,再刷数据结构,同时每天都要刷dp.当然,对于擅长的图论,eleveni决定从蓝题开始刷.当然 ...

  5. 2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分)

    2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分) https://www.luogu.com.cn/problem/P2375 题意: PS:这道神题的背景让人疑惑,重 ...

  6. 2021.11.14 CF1583E Moment of Bloom(LCA+图上构造)

    2021.11.14 CF1583E Moment of Bloom(LCA+图上构造) https://www.luogu.com.cn/problem/CF1583E 题意: She does h ...

  7. 2021.11.11 EXKMP

    2021.11.11 EXKMP https://www.luogu.com.cn/problem/P5410 下标以1开头: #include<cstdio> #include<i ...

  8. 2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP)

    2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP) https://www.luogu.com.cn/problem/P4052 题意: JSOI 交给队员 ZYX ...

  9. 2021.11.10 fail树

    2021.11.10 fail树 https://blog.csdn.net/niiick/article/details/87947160 1. AC自动机与fail树的神奇关系 1.1 AC自动机 ...

随机推荐

  1. 3gcms导航,实现当前栏目高亮的办法

    <volist name="menu" id="vo" offset="0" length='8' key='k'> <l ...

  2. seo执行步骤

    第一个金字塔策略这个很适用于大型网站,我想做过大型网站,特别是关键词比较多比较杂乱的站长来说,这个图太熟悉不过了,就算是没有见过,但实际操作中早就用到了这些手法.如果能把这个图领会透并实际应用,做一个 ...

  3. 搭建http文件服务器 - Windows使用IIS搭建http文件服务器

  4. jmeter长时间压测

    如何进行24h小时的压测? 长时间压测注意事项 生成报告文件过大 https://www.cnblogs.com/SunshineKimi/p/12298668.html

  5. 【译】.NET Core 3.0 发布小尺寸 self-contained 单体可执行程序

    .NET Core 提供的发布应用程序选项 self-contained 是共享应用程序的好方法,因为应用程序的发布目录包含所有组件.运行时和框架.您只需要告诉使用者应用程序的入口 exe 文件,就可 ...

  6. 鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务 | 百篇博客分析OpenHarmony源码 | v41.03

    百篇博客系列篇.本篇为: v41.xx 鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁 ...

  7. html2canvas 无法渲染网络图片及本地 解决方案

    使用html2canvas插件可以无法渲染图片的情况 在使用html2canvas的时候.如果元素中还包含网络图片.那么有很大的几率渲染不出来.即时把html2canvas的允许跨域打开也无济于事.这 ...

  8. 从源码分析node-gyp指定node库文件下载地址

    当我们安装node的C/C++原生模块时,涉及到使用node-gyp对C/C++原生模块的编译工作(configure.build).这个过程,需要nodejs的头文件以及静态库参与(后续称库文件)对 ...

  9. ArcToolbox工具箱

    3D Analyst 工具 Data Interoperability Tools Geostatistical Analyst 工具 Network Analyst 工具 Schematics 工具 ...

  10. 前段--->js

    一,java script的引入方式 1,直接在script里书写你的代码 <script> alert("hbflfb")</script> 2,引入额外 ...