题目链接
(AC代码在最后面)
Description
In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller 3 × 3 subgrids. For example,
.
2
7
3
8
.
.
1
.
.
1
.
.
.
6
7
3
5
.
.
.
.
.
.
.
2
9
3
.
5
6
9
2
.
8
.
.
.
.
.
.
.
.
.
.
.
6
.
1
7
4
5
.
3
6
4
.
.
.
.
.
.
.
9
5
1
8
.
.
.
7
.
.
8
.
.
6
5
3
4
.
Given some of the numbers in the grid, your goal is to determine the remaining numbers such that the numbers 1 through 9 appear exactly once in (1) each of nine 3 × 3 subgrids, (2) each of the nine rows, and (3) each of the nine columns.
Input
The input test file will contain multiple cases. Each test case consists of a single line containing 81 characters, which represent the 81 squares of the Sudoku grid, given one row at a time. Each character is either a digit (from 1 to 9) or a period (used to indicate an unfilled square). You may assume that each puzzle in the input will have exactly one solution. The end-of-file is denoted by a single line containing the word “end”.
Output
For each test case, print a line representing the completed Sudoku puzzle.
Sample Input
.2738..1..1...6735.......293.5692.8...........6.1745.364.......9518...7..8..6534.
......52..8.4......3...9...5.1...6..2..7........3.....6...1..........7.4.......3.
end
Sample Output
527389416819426735436751829375692184194538267268174593643217958951843672782965341
416837529982465371735129468571298643293746185864351297647913852359682714128574936
如果按照POJ2676 Sudoku、POJ2918 Tudoku(数独(一))做是行不通的,需要进一步优化
超时代码:
//CSDN博客:https://blog.csdn.net/qq_40889820
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
#define random(a,b) (rand()%(b-a+1)+a)
#define e 2.71828182
#define Pi 3.141592654
using namespace std;
char table[10][10];
int row[10][10],col[10][10],grid[10][10];
bool flag=false;
void dfs(int x,int y)//填第(x,y)格
{
if(flag) return;//已找到一种解法
if(y>9) y=1,x+=1;
if(x>9)
{
for(int i=1;i<=9;i++)
cout<>str)
{
if(str=="end") break;
int count=0;
mem(row,0);mem(col,0);mem(grid,0);
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
{
table[i][j]=str[count++];
if(table[i][j]=='.') table[i][j]='0';
row[i][table[i][j]-'0']=1;
col[j][table[i][j]-'0']=1;
int ord=(i-1)/3*3+(j-1)/3+1;
grid[ord][table[i][j]-'0']=1;
}
dfs(1,1);
cout<
样例用时:
位运算优化,利用三个一维数组row[10],col[10],grid[10]的二进制来记录数字的占用情况。 可填的数字为1~9,故令init=111111111(2)=511=(1<<9)-1,表示一开始1~9都可以填(都未被占用),row[i]表示第i行数字的占用情况,col数组和grid数组同理。当需要获取一个x行y列z方块的空白格子能填的数字只需要先将row[x]&col[y]&grid[z](位与),再利用lowbit函数和预先处理好的figure数组依次取出能填的数字,如100100010即代表数字2、6、9可填。利用异或运算更新状态。
//CSDN博客:https://blog.csdn.net/qq_40889820
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
#define random(a,b) (rand()%(b-a+1)+a)
#define e 2.71828182
#define Pi 3.141592654
using namespace std;
char table[10][10];
int row[10],col[10],grid[10];//二进制记录行、列、方块的数字占用情况
int figure[(1<<8)+1];//
bool flag=false;
int lowbit(int x)
{
return x&(-x);
}
void dfs(int x,int y)//填第(x,y)格
{
if(flag) return;//已找到一种解法
if(y>9) y=1,x+=1;
if(x>9)
{
for(int i=1;i<=9;i++)
cout<0;i-=lowbit(i))
{
int num=figure[lowbit(i)];//可填的数字
table[x][y]=num+'0';
row[x] ^= lowbit(i);
col[y] ^= lowbit(i);
grid[ord] ^= lowbit(i);
dfs(x,y+1);
//回溯
table[x][y]='0';
row[x] ^= lowbit(i);
col[y] ^= lowbit(i);
grid[ord] ^= lowbit(i);
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
string str;
for(int i=0;i<9;i++)
figure[1<>str)
{
if(str=="end") break;
int count=0;
for(int i=1;i<=9;i++)
row[i]=col[i]=grid[i]=init;
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
{
table[i][j]=str[count++];
if(table[i][j]=='.')
{
table[i][j]='0';
continue;
}
row[i] ^= (1<<(table[i][j]-'0'-1));
col[j] ^= (1<<(table[i][j]-'0'-1));
int ord=(i-1)/3*3+(j-1)/3+1;
grid[ord] ^= (1<<(table[i][j]-'0'-1));
}
/*clock_t t;
t=clock();*/
dfs(1,1);
/*t=clock()-t;
cout<<"时间为:"<<(((float)t)/CLOCKS_PER_SEC*1000)<<"ms\n";*/
cout<
样例用时:(由样例来看优化并不是特别明显?但是实际上位运算优化能提升较大的性能)
优化一下搜索顺序,优先处理可选数字较少的格子 ,一开始是静态的保存好,并未考虑到一个格子填好胡会对后续格子造成影响。
//CSDN博客:https://blog.csdn.net/qq_40889820
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
#define random(a,b) (rand()%(b-a+1)+a)
#define e 2.71828182
#define Pi 3.141592654
using namespace std;
struct node
{
int x,y,z;//第x行,第y列,第z个方块
vector able;//可填数字
friend bool operator < (node a,node b)
{
if(a.able.size()!=b.able.size()) return a.able.size()sum)
{
for(int i=1;i<=9;i++)
cout<>str)
{
if(str=="end") break;
int count=0;
mem(row,0);mem(col,0);mem(grid,0);
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
{
table[i][j]=str[count++];
if(table[i][j]=='.') table[i][j]='0';
row[i][table[i][j]-'0']=1;
col[j][table[i][j]-'0']=1;
int ord=(i-1)/3*3+(j-1)/3+1;
grid[ord][table[i][j]-'0']=1;
}
count=0;
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
{
if(table[i][j]!='0') continue;
count++;
p[count].able.clear();//血与泪的教训!!这个坑太深了
p[count].x=i,p[count].y=j;
int ord=(i-1)/3*3+(j-1)/3+1;
p[count].z=ord;
for(int k=1;k<=9;k++)
if(!row[i][k]&&!col[j][k]&&!grid[ord][k])
p[count].able.push_back(k);
}
sort(p+1,p+count+1);
/*clock_t t;
t=clock();*/
dfs(1,count);
/*t=clock()-t;
cout<<"时间为:"<<(((float)t)/CLOCKS_PER_SEC*1000)<<"ms\n";*/
cout<
当对node里<号的重载为
if(a.able.size()!=b.able.size()) return a.able.size()
时,即按可选数字数递增,若相同则按原顺序 进行搜索,所需时间为:
当对node里<号的重载为
if(a.x!=b.x) return a.x
时,即按原顺序(数独中从上到下,从左到右)进行搜索,所需时间为:
很显然,这样做并不能满足要求。
后来改为动态查询,每次都查找可选数字最少的格子 。但还是不幸超时
//CSDN博客:https://blog.csdn.net/qq_40889820
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
#define random(a,b) (rand()%(b-a+1)+a)
#define e 2.71828182
#define Pi 3.141592654
#define P pair
using namespace std;
char table[10][10];
int row[10],col[10],grid[10];//二进制记录行、列、方块的数字占用情况
int figure[(1<<8)+1];//
int lowbit(int x)
{
return x&(-x);
}
int z[10][10]={{0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,2,2,2,3,3,3},
{0,1,1,1,2,2,2,3,3,3},
{0,1,1,1,2,2,2,3,3,3},
{0,4,4,4,5,5,5,6,6,6},
{0,4,4,4,5,5,5,6,6,6},
{0,4,4,4,5,5,5,6,6,6},
{0,7,7,7,8,8,8,9,9,9},
{0,7,7,7,8,8,8,9,9,9},
{0,7,7,7,8,8,8,9,9,9}};
int num(int n)//返回可填数字个数
{
int ans=0;
for(int i=n;i;i-=lowbit(i))
ans++;
return ans;
}
P Min()//获得可填数字数最少的格子
{
int x=0,y=0,Min=1<<30;
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
if(table[i][j]!='0') continue;
int status=row[i]&col[j]&grid[z[i][j]];
if(!status) return P(-1,-1);//该格子无可填的数字
if(num(status)0;i-=lowbit(i))
{
int num=figure[lowbit(i)];//可填的数字
table[x][y]=num+'0';
row[x] ^= lowbit(i);
col[y] ^= lowbit(i);
grid[z[x][y]] ^= lowbit(i);
P p=Min();
if(p.first==-1)
{
table[x][y]='0';
row[x] ^= lowbit(i);
col[y] ^= lowbit(i);
grid[z[x][y]] ^= lowbit(i);
continue;
}
if(p.first==0) return true;
if(dfs(p.first,p.second)) return true;
table[x][y]='0';
row[x] ^= lowbit(i);
col[y] ^= lowbit(i);
grid[z[x][y]] ^= lowbit(i);
}
return false;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
string str;
for(int i=0;i<9;i++)
figure[1<>str)
{
if(str=="end") break;
int count=0;
for(int i=1;i<=9;i++)
row[i]=col[i]=grid[i]=init;
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
{
table[i][j]=str[count++];
if(table[i][j]=='.')
{
table[i][j]='0';
continue;
}
row[i] ^= (1<<(table[i][j]-'0'-1));
col[j] ^= (1<<(table[i][j]-'0'-1));
grid[z[i][j]] ^= (1<<(table[i][j]-'0'-1));
}
/*clock_t t;
t=clock();*/
P p=Min();
dfs(p.first,p.second);
//t=clock()-t;
for(int i=1;i<=9;i++)
cout<
然后将各个10进制数字代表能填数字的个数保存在数组里,终于是过了
显然还有更进一步的优化,留在POJ3076去探索吧。
AC代码:
//CSDN博客:https://blog.csdn.net/qq_40889820
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
#define random(a,b) (rand()%(b-a+1)+a)
#define e 2.71828182
#define Pi 3.141592654
#define P pair
using namespace std;
char table[10][10];
int row[10],col[10],grid[10];//二进制记录行、列、方块的数字占用情况
int num[(1<<9)];//
int lowbit(int x)
{
return x&(-x);
}
int z[10][10]={{0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,2,2,2,3,3,3},
{0,1,1,1,2,2,2,3,3,3},
{0,1,1,1,2,2,2,3,3,3},
{0,4,4,4,5,5,5,6,6,6},
{0,4,4,4,5,5,5,6,6,6},
{0,4,4,4,5,5,5,6,6,6},
{0,7,7,7,8,8,8,9,9,9},
{0,7,7,7,8,8,8,9,9,9},
{0,7,7,7,8,8,8,9,9,9}};
int fun(int n)//返回可填数字个数
{
int ans=0;
for(int i=n;i;i-=lowbit(i))
ans++;
return ans;
}
P Min()//获得可填数字数最少的格子
{
int x=0,y=0,Min=1<<30;
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
if(table[i][j]!='0') continue;
int status=row[i]&col[j]&grid[z[i][j]];
if(!status) return P(-1,-1);//该格子无可填的数字
if(num[status]>(i-1) & 1)//数字i未被占用
{
table[x][y]=i+'0';
row[x] ^= (1<< i-1);
col[y] ^= (1<< i-1);
grid[z[x][y]] ^= (1<< i-1);
P p=Min();
if(p.first==-1)
{
table[x][y]='0';
row[x] ^= (1<< i-1);
col[y] ^= (1<< i-1);
grid[z[x][y]] ^= (1<< i-1);
continue;
}
if(p.first==0) return true;
if(dfs(p.first,p.second)) return true;
table[x][y]='0';
row[x] ^= (1<< i-1);
col[y] ^= (1<< i-1);
grid[z[x][y]] ^= (1<< i-1);
}
}
return false;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
string str;
for(int i=0;i<(1<<9);i++)
num[i]=fun(i);
int init=(1<<9)-1;//二进制为111111111
while(cin>>str)
{
if(str=="end") break;
int count=0;
for(int i=1;i<=9;i++)
row[i]=col[i]=grid[i]=init;
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
{
table[i][j]=str[count++];
if(table[i][j]=='.')
{
table[i][j]='0';
continue;
}
row[i] ^= (1<<(table[i][j]-'0'-1));
col[j] ^= (1<<(table[i][j]-'0'-1));
grid[z[i][j]] ^= (1<<(table[i][j]-'0'-1));
}
/*clock_t t;
t=clock();*/
P p=Min();
dfs(p.first,p.second);
//t=clock()-t;
for(int i=1;i<=9;i++)
cout<
样例用时:(显然样例只能当样例看)
参考资料: 搜索_常规DFS_POJ3074_Sudoku Sicily1317-Sudoku-位运算暴搜 二进制-高效位运算
你可能感兴趣的:(#,>>>>深度优先搜索,∨∨Acm)
LWC-KD:图结构感知的推荐系统增量学习对比知识蒸馏
宇直不会放弃
GKD-Middle layer 人工智能 python chatgpt gpu算力 深度学习 机器学习 神经网络
LWC-KD:图结构感知的推荐系统增量学习对比知识蒸馏《GraphStructureAwareContrastiveKnowledgeDistillationforIncrementalLearninginRecommenderSystems》2021作者是YueningWang、YingxueZhang和MarkCoates论文地址:https://dl.acm.org/doi/10.1145/
dfs:五子棋对弈15蓝桥杯a组1题
关于不上作者榜就原神启动那件事
深度优先 算法
题目分析问题描述在一个5×5的棋盘上,小蓝(白棋)和小桥(黑棋)交替下棋,白棋先手。要求棋盘被填满时,双方均未形成五连珠,求满足条件的棋局数目。关键条件1.**棋盘填满**:白棋13个,黑棋12个。2.**平局判定**:填满时,所有行、列、对角线均无连续五个同色棋子。3.**下棋顺序**:必须严格交替,白棋先手。---解法思路深度优先搜索(DFS)结合剪枝通过DFS遍历所有可能的棋盘状态,在填满棋
作为 .NET CAD 二次开发工程师的核心知识与建议
周杰伦fans
ai学习参考 Cad二次开发.NET笔记 学习C#的笔记 .net
作为.NETCAD二次开发工程师的核心知识与建议一、必备知识与硬性要求编程技能与工具•C#与.NET平台:◦熟练掌握C#语法、面向对象编程(OOP)、泛型、LINQ等核心特性。◦需熟悉AutoCAD.NETAPI(如acdbmgd.dll、acmgd.dll),能通过CommandMethod创建自定义命令。示例:[CommandMethod("DrawLine")]publicvoidDrawL
电机的类型详解
全职编程-叶秋意
stm32(stm32F103 stm32L151) 电机 无刷电机 交流电机
目录1.直流电机(DCMotor)1.1永磁直流电机(PMDC)1.2无刷直流电机(BLDC)1.3有刷直流电机(BrushedDCMotor)2.交流电机(ACMotor)2.1感应电机(InductionMotor)2.1.1三相感应电机2.1.2单相感应电机2.2同步电机(SynchronousMotor)2.2.1永磁同步电机(PMSM)2.2.2励磁同步电机3.特殊类型电机3.1步进电机
动态规划--简单递推
一只IT小小鸟
算法知识 dp acm 动态规划学习 动态规划 递推
动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力、建模抽象能力、灵活度。*************************************************************************************************************动态规划(英语:Dynamicprogramming
初学——DFS(深度优先搜索)
g927zz
搜索 深度优先 算法
P2089烤鸡题目背景猪猪Hanke得到了一只鸡。题目描述猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢?因为他有10种配料(芥末、孜然等),每种配料可以放1到3克,任意烤鸡的美味程度为所有配料质量之和。现在,Hanke想要知道,如果给你一个美味程度n,请输出这10种配料的所有搭配方案。输入格式一个正整数n,表示美味程度。输出格式第一行,方案总数。第二行
华为OD机试真题 - 精准核酸检测 - 深度优先搜索DFS(Python/JS/C/C++ 2024 D卷 200分)
哪 吒
华为od 深度优先 python
华为OD机试2024E卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。一、题目描述为了达到新冠疫情精准防控的需要,为了避免全
【ACM独立出版-录用文章全部递交EI检索-检索稳定】2025年数字化教育与信息技术国际学术会议(DEIT 2025)
AEIC_GAO
数据挖掘 大数据 人工智能 数据分析 教育电商 zoom会议
【会议亮点】1.EI检索稳定:ACMInternationalConferenceProceedingsSeries独立出版2.参会人数多,口头报告和海报展示均提供正式的参会证书3.线下参会包含三餐,茶歇、会议物料:定制手提袋、会议手册、会议通知、会议日程、会议邀请函等证明类文件4.线上与线下同步进行,支持不便到线下的参会者线上参与,均享有与线下会场一样的发言权利5.主办单位为湖南师范大学教育科学
国内外算法比赛推荐
AspiringUstcer_1958
C++学习 算法 c++
引言在计算机科学领域,算法比赛是提升编程技能、检验学习成果的绝佳途径。对于C++语言的爱好者来说,选择一个高质量且对C++支持良好的算法比赛至关重要。今天,将从国内外两个维度为大家推荐这类比赛。国际知名算法比赛ACM国际大学生程序设计竞赛(ACM-ICPC)ACM-ICPC是一项在全球范围内极具影响力的大学生算法和编程竞赛,自1970年起举办,历史悠久且规模宏大。参赛队伍由三名大学生组成,需在五小
2024年图灵奖公布:两位AI先锋因强化学习获奖
吴脑的键客
人工智能 人工智能 chatgpt
据《纽约时报》报道,全球最大的计算机专业人士协会计算机协会(ACM)周三宣布,将2024年图灵奖授予安德鲁·巴托(AndrewBarto)博士和理查德·萨顿(RichardSutton)博士,以表彰他们在强化学习方面的研究。巴托目前是马萨诸塞大学荣誉退休教授。萨顿现在担任阿尔伯塔大学教授,他也是前DeepMind研究科学家。两人将分享图灵奖的100万美元奖金。图灵奖设立于1966年,常被称为“计算
【微代码】在Mellanox驱动中有哪些work?以及有哪些workqueue?
北冥的备忘录
网络 服务器 Mellanox
work比如常见的几个work:ib_cq_poll_work用来pollcq的health_recover_work用来fw健康恢复的mlx5e_tx_timeout_worktxtimeout的cma_work_handler用来管理rdmacm的事件的workqueueworkarp_repath->workipoib_repath_ahassoc->del_worknvmet_fc_del
华为OD机试 - 连续出牌数量 - 深度优先搜索dfs算法(Python/JS/C/C++ 2024 B卷 200分)
哪 吒
算法 华为od 深度优先
华为OD机试2024E卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。一、题目描述有这么一款单人卡牌游戏,牌面由颜色和数字组成,颜色为红、黄、蓝、
华为OD机试 - 任务最优调度 - 深度优先搜索dfs算法(Python/JS/C/C++ 2024 B卷 200分)
哪 吒
算法 华为od 深度优先
华为OD机试2024E卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。一、题目描述给定一个正整数数组表示待系统执行的任务列表,数组的每一个元素代表
华为OD机试 - 全排列 - 深度优先搜索DFS(Python/JS/C/C++ 2024 C卷 100分)
哪 吒
华为od 深度优先 python
华为OD机试2024E卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。一、题目描述给定一个只包含大写英文字母的字符串S,要求你给出对S重新排列的所
华为OD机试 - 图像物体的边界 - 深度优先搜索(Python/JS/C/C++ 2024 D卷 200分)
哪 吒
华为od 深度优先 python
华为OD机试2024E卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。一、题目描述给定一个二维数组M行N列,二维数组里的数字代表图片的像素,为了简
华为OD机试 - 找单词 - 深度优先搜索DFS(Python/JS/C/C++ 2024 E卷 200分)
哪 吒
华为od 深度优先 python
华为OD机试2024E卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。一、题目描述给一个字符串和一个二维字符数组Q,如果该字
记忆化搜索与动态规划
好运莲莲~
动态规划
深度优先搜索和动态规划都可以解决最优解问题,即从很多解决问题的方案中找到最优的一个。很多情况下,最优解问题最直接的思维就是递归(深度优先搜索)。递归求解子问题时,没有出现重复子问题,则没有必要用动态规划,直接普通的递归就可以了;如果出现重复子问题就可以考虑记忆化搜索和动态规划,并且任何记忆化搜索都能改成动态规划。个人认为记忆话搜索思维更直接更简单,所以如果遇到一道从来没接触过的题目时,可以想想记忆
算法基础课——第三章 搜索与图论(一)
华北理工大学ACM协会
算法竞赛——算法基础课 图论 算法 c++
第三章搜索与图论(一)DFS与BFS的区别与联系都可以对整个问题空间进行遍历;搜索的结构都像树一样;但搜索的顺序是不同的;深度优先搜索是尽可能往深里搜,当搜到叶子节点的时候回溯;DFSDFSDFS就像一个非常执着的人,它会不断往深里搜,搜到头后回去的时候也还不是直接回到头,而是边回去边看能不能继续往前走,只有确定当前点所有路都走不了的时候,才会往回退一步;下图中的树代表整个问题空间,节点上的数字代
CAD插件技术真心不难,无非是画点线条,CAD内部能实现的,C#调用acdbmgd.dll和acmgd.dll也能实现
思杰软件
c#
CAD插件看起来很神秘,其实一个合格码农经过几天就能快速掌握。没什么秘密,开发CAD插件和winform一样简单学几个类库用法就是(只是太多人不喜欢知识分享),在CAD里展现界面和winform略有不同(整个项目工程在文章的最后有下载)。学习CAD插件开发的动机是为了薪水,由于公司是做显示屏和触摸屏的,养了一堆CAD的设计工程师拿着8K以上的薪水,当时我做为信息系统开发人员才拿4K,4个人要开发维
编程题 - 汽水瓶【JavaScript/Node.js解法】
幸运小圣
编程题 javascript node.js
“学如逆水行舟,不进则退。”——《增广贤文》目录汽水瓶题目:解答分析:js代码解答-ACM模式:代码通过:题解分析:简洁思路代码:汽水瓶题目:某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。输入描述:本题将会给出1=3){letnewBottles=Math.floor(val/3);totalBott
深度优先和广度优先【栈、堆前端举例】
幸运小圣
JavaScript 前端 算法 数据结构
深度优先和广度优先:深度优先搜索(DFS)和广度优先搜索(BFS)是两种用于图和树遍历的算法,它们各自有不同的应用场景和特点。深度优先DFS:深度优先搜索(DFS)的核心思想是“深入探索,直至无路可走,然后再回溯”。它从起始节点开始,沿着一条路径一直遍历到最后一个节点,然后回溯到上一个节点继续遍历其他路径。DFS适合用于查找目标节点在深度较大的情况下,可以节省存储空间,但可能导致无限循环。DF
⭐算法OJ⭐矩阵的相关操作【深度优先搜索 DFS + 回溯】(C++ 实现)Unique Paths 系列
Vitalia
C/C++ 算法OJ 算法 矩阵 深度优先
980.UniquePathsIIIYouaregivenanmxnintegerarraygridwheregrid[i][j]couldbe:1representingthestartingsquare.Thereisexactlyonestartingsquare.2representingtheendingsquare.Thereisexactlyoneendingsquare.0repr
华为OD机试真题---开心消消乐
努力努力再努力呐
java 算法 数据结构 华为od 算法 java 开发语言 数据结构
华为OD机试真题“开心消消乐”是一道有趣的算法题,主要考察的是对二维矩阵的遍历和深度优先搜索(DFS)算法的应用。以下是对这道题的详细解析:一、题目描述给定一个N行M列的二维矩阵,矩阵中每个位置的数字取值为0或1。现需要将矩阵中所有的1进行反转为0,规则如下:当点击一个1时,该1被反转为0,同时相邻的上、下、左、右,以及左上、左下、右上、右下8个方向的1(如果存在)均会自动反转为0。进一步地,一个
【竞赛专用方法总结】蓝桥杯-ACM比赛参考
JokerSZ.
蓝桥杯 算法 数据结构 竞赛 编程
基础部分数位拆分进位模拟最大公约、最小公倍数、质数、素数试除法判定质数——模板题AcWing866.试除法判定质数boolis_prime(intx){if(x1)coutget_divisors(intx){vectorres;for(inti=1;i1)res=res/x*(x-1);returnres;}筛法求欧拉函数——模板题AcWing874.筛法求欧拉函数intprimes[N],cn
Cuppa CMS任意文件读取漏洞(CVE-2022-25401)
风中追风-fzzf
# 文件读取 安全 web安全
一、漏洞概述CuppaCMSv1.0中文件管理器的复制功能允许将任何文件复制到当前目录,从而授予攻击者对任意文件得读取权限,/templates/default/html/windows/right.php文件存在任意文件读取漏洞。二、影响范围v1.0三、访问页面四、漏洞复现1、访问接口POST接口/templates/default/html/windows/right.phpPOST/temp
使用 acme.sh 申请和管理 免费SSL 证书:告别 certbot 的繁琐
lihuang319
linux ssl
使用acme.sh申请和管理SSL证书:告别certbot的繁琐引言介绍SSL证书的重要性传统certbot的痛点(如live目录、复杂的配置)acme.sh的优势(轻量、灵活、自动化)一、acme.sh简介什么是acme.shacme.sh的主要特点支持多种DNS服务商自动化续期直接指定证书路径无需额外依赖二、安装acme.sh基本安装curlhttps://get.acme.sh|sh-sem
100种算法【Python版】第38篇—— Tarjan算法
AnFany
算法 python 开发语言 Tarjan算法 群体分析
本文目录1算法说明2算法示例:社交群体分析3算法示例:交通路网中的强连通分量识别4算法应用1算法说明Tarjan算法由计算机科学家RobertTarjan于1972年提出,目的是在有向图中有效地找到强连通分量(StronglyConnectedComponents,SCC)。强连通分量是指图中一个最大子图,其中任意两个节点之间都有路径相互可达。Tarjan算法是基于深度优先搜索(DFS)的一种高效
Python实现强连通分量算法——Tarjan算法
NoABug
算法 深度优先 python
Python实现强连通分量算法——Tarjan算法Tarjan算法是一种基于深度优先搜索(DFS)的强连通分量(SCC)查找算法,由RobertTarjan在1972年提出。它采用了栈(Stack)数据结构来记录已发现但未处理完的节点,并通过对每个节点进行DFS遍历来寻找强连通分量。以下是Python实现的Tarjan算法的完整源码:#-*-coding:utf-8-*-deftarjan(gra
2024年下半年郑州大学ACM招新赛题解(ABCDEFGHIJKL)
lskkkkkkkkkkkk
C++ 题解 算法 数据结构 zzuacm招新赛
An-th题意已知公式π=∑k=0∞116k(48k+1−28k+4−18k+5−18k+6)\pi=\sum_{k=0}^{\infty}\frac{1}{16^k}(\frac{4}{8k+1}-\frac{2}{8k+4}-\frac{1}{8k+5}-\frac{1}{8k+6})π=∑k=0∞16k1(8k+14−8k+42−8k+51−8k+61)请你求出π\piπ的十六进制的小数点后
Mac M1安装Python---kalrry
kalrry
Python python macos 开发语言
MacM1安装Python---kalrry一、准备二、安装三、配置环境变量1、配置环境2、测试3、pip3与pip建立软链接四、参考备份一、准备Python3.9.1发布后开始支持苹果M1和macOS11BigSur也就是我们要下载3.9.1以后的版本,最好选择最新稳定版python官网下载python阿里网盘下载—sa65二、安装双击正常一路next安装即可三、配置环境变量1、配置环境命令行输
jdk tomcat 环境变量配置
Array_06
java jdk tomcat
Win7 下如何配置java环境变量
1。准备jdk包,win7系统,tomcat安装包(均上网下载即可)
2。进行对jdk的安装,尽量为默认路径(但要记住啊!!以防以后配置用。。。)
3。分别配置高级环境变量。
电脑-->右击属性-->高级环境变量-->环境变量。
分别配置 :
path
&nbs
Spring调SDK包报java.lang.NoSuchFieldError错误
bijian1013
java spring
在工作中调另一个系统的SDK包,出现如下java.lang.NoSuchFieldError错误。
org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.l
LeetCode[位运算] - #136 数组中的单一数
Cwind
java 题解 位运算 LeetCode Algorithm
原题链接:#136 Single Number
要求:
给定一个整型数组,其中除了一个元素之外,每个元素都出现两次。找出这个元素
注意:算法的时间复杂度应为O(n),最好不使用额外的内存空间
难度:中等
分析:
题目限定了线性的时间复杂度,同时不使用额外的空间,即要求只遍历数组一遍得出结果。由于异或运算 n XOR n = 0, n XOR 0 = n,故将数组中的每个元素进
qq登陆界面开发
15700786134
qq
今天我们来开发一个qq登陆界面,首先写一个界面程序,一个界面首先是一个Frame对象,即是一个窗体。然后在这个窗体上放置其他组件。代码如下:
public class First { public void initul(){ jf=ne
Linux的程序包管理器RPM
被触发
linux
在早期我们使用源代码的方式来安装软件时,都需要先把源程序代码编译成可执行的二进制安装程序,然后进行安装。这就意味着每次安装软件都需要经过预处理-->编译-->汇编-->链接-->生成安装文件--> 安装,这个复杂而艰辛的过程。为简化安装步骤,便于广大用户的安装部署程序,程序提供商就在特定的系统上面编译好相关程序的安装文件并进行打包,提供给大家下载,我们只需要根据自己的
socket通信遇到EOFException
肆无忌惮_
EOFException
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2281)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:
基于spring的web项目定时操作
知了ing
java Web
废话不多说,直接上代码,很简单 配置一下项目启动就行
1,web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="h
树形结构的数据库表Schema设计
矮蛋蛋
schema
原文地址:
http://blog.csdn.net/MONKEY_D_MENG/article/details/6647488
程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门、栏目结构、商品分类等等,通常而言,这些树状结构需要借助于数据库完成持久化。然而目前的各种基于关系的数据库,都是以二维表的形式记录存储数据信息,
maven将jar包和源码一起打包到本地仓库
alleni123
maven
http://stackoverflow.com/questions/4031987/how-to-upload-sources-to-local-maven-repository
<project>
...
<build>
<plugins>
<plugin>
<groupI
java IO操作 与 File 获取文件或文件夹的大小,可读,等属性!!!
百合不是茶
类 File
File是指文件和目录路径名的抽象表示形式。
1,何为文件:
标准文件(txt doc mp3...)
目录文件(文件夹)
虚拟内存文件
2,File类中有可以创建文件的 createNewFile()方法,在创建新文件的时候需要try{} catch(){}因为可能会抛出异常;也有可以判断文件是否是一个标准文件的方法isFile();这些防抖都
Spring注入有继承关系的类(2)
bijian1013
java spring
被注入类的父类有相应的属性,Spring可以直接注入相应的属性,如下所例:1.AClass类
package com.bijian.spring.test4;
public class AClass {
private String a;
private String b;
public String getA() {
retu
30岁转型期你能否成为成功人士
bijian1013
成长 励志
很多人由于年轻时走了弯路,到了30岁一事无成,这样的例子大有人在。但同样也有一些人,整个职业生涯都发展得很优秀,到了30岁已经成为职场的精英阶层。由于做猎头的原因,我们接触很多30岁左右的经理人,发现他们在职业发展道路上往往有很多致命的问题。在30岁之前,他们的职业生涯表现很优秀,但从30岁到40岁这一段,很多人
【Velocity四】Velocity与Java互操作
bit1129
velocity
Velocity出现的目的用于简化基于MVC的web应用开发,用于替代JSP标签技术,那么Velocity如何访问Java代码.本篇继续以Velocity三http://bit1129.iteye.com/blog/2106142中的例子为基础,
POJO
package com.tom.servlets;
public
【Hive十一】Hive数据倾斜优化
bit1129
hive
什么是Hive数据倾斜问题
操作:join,group by,count distinct
现象:任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成;查看未完成的子任务,可以看到本地读写数据量积累非常大,通常超过10GB可以认定为发生数据倾斜。
原因:key分布不均匀
倾斜度衡量:平均记录数超过50w且
在nginx中集成lua脚本:添加自定义Http头,封IP等
ronin47
nginx lua csrf
Lua是一个可以嵌入到Nginx配置文件中的动态脚本语言,从而可以在Nginx请求处理的任何阶段执行各种Lua代码。刚开始我们只是用Lua 把请求路由到后端服务器,但是它对我们架构的作用超出了我们的预期。下面就讲讲我们所做的工作。 强制搜索引擎只索引mixlr.com
Google把子域名当作完全独立的网站,我们不希望爬虫抓取子域名的页面,降低我们的Page rank。
location /{
java-3.求子数组的最大和
bylijinnan
java
package beautyOfCoding;
public class MaxSubArraySum {
/**
* 3.求子数组的最大和
题目描述:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4,
Netty源码学习-FileRegion
bylijinnan
java netty
今天看org.jboss.netty.example.http.file.HttpStaticFileServerHandler.java
可以直接往channel里面写入一个FileRegion对象,而不需要相应的encoder:
//pipeline(没有诸如“FileRegionEncoder”的handler):
public ChannelPipeline ge
使用ZeroClipboard解决跨浏览器复制到剪贴板的问题
cngolon
跨浏览器 复制到粘贴板 Zero Clipboard
Zero Clipboard的实现原理
Zero Clipboard 利用透明的Flash让其漂浮在复制按钮之上,这样其实点击的不是按钮而是 Flash ,这样将需要的内容传入Flash,再通过Flash的复制功能把传入的内容复制到剪贴板。
Zero Clipboard的安装方法
首先需要下载 Zero Clipboard的压缩包,解压后把文件夹中两个文件:ZeroClipboard.js
单例模式
cuishikuan
单例模式
第一种(懒汉,线程不安全):
public class Singleton { 2 private static Singleton instance; 3 pri
spring+websocket的使用
dalan_123
一、spring配置文件
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.or
细节问题:ZEROFILL的用法范围。
dcj3sjt126com
mysql
1、zerofill把月份中的一位数字比如1,2,3等加前导0
mysql> CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL, -> day
Android开发10——Activity的跳转与传值
dcj3sjt126com
Android开发
Activity跳转与传值,主要是通过Intent类,Intent的作用是激活组件和附带数据。
一、Activity跳转
方法一Intent intent = new Intent(A.this, B.class); startActivity(intent)
方法二Intent intent = new Intent();intent.setCla
jdbc 得到表结构、主键
eksliang
jdbc 得到表结构、主键
转自博客:http://blog.csdn.net/ocean1010/article/details/7266042
假设有个con DatabaseMetaData dbmd = con.getMetaData(); rs = dbmd.getColumns(con.getCatalog(), schema, tableName, null); rs.getSt
Android 应用程序开关GPS
gqdy365
android
要在应用程序中操作GPS开关需要权限:
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
但在配置文件中添加此权限之后会报错,无法再eclipse里面正常编译,怎么办?
1、方法一:将项目放到Android源码中编译;
2、方法二:网上有人说cl
Windows上调试MapReduce
zhiquanliu
mapreduce
1.下载hadoop2x-eclipse-plugin https://github.com/winghc/hadoop2x-eclipse-plugin.git 把 hadoop2.6.0-eclipse-plugin.jar 放到eclipse plugin 目录中。 2.下载 hadoop2.6_x64_.zip http://dl.iteye.com/topics/download/d2b
如何看待一些知名博客推广软文的行为?
justjavac
博客
本文来自我在知乎上的一个回答:http://www.zhihu.com/question/23431810/answer/24588621
互联网上的两种典型心态:
当初求种像条狗,如今撸完嫌人丑
当初搜贴像条犬,如今读完嫌人软
你为啥感觉不舒服呢?
难道非得要作者把自己的劳动成果免费给你用,你才舒服?
就如同 Google 关闭了 Gooled Reader,那是
sql优化总结
macroli
sql
为了是自己对sql优化有更好的原则性,在这里做一下总结,个人原则如有不对请多多指教。谢谢!
要知道一个简单的sql语句执行效率,就要有查看方式,一遍更好的进行优化。
一、简单的统计语句执行时间
declare @d datetime ---定义一个datetime的变量set @d=getdate() ---获取查询语句开始前的时间select user_id
Linux Oracle中常遇到的一些问题及命令总结
超声波
oracle linux
1.linux更改主机名
(1)#hostname oracledb 临时修改主机名
(2) vi /etc/sysconfig/network 修改hostname
(3) vi /etc/hosts 修改IP对应的主机名
2.linux重启oracle实例及监听的各种方法
(注意操作的顺序应该是先监听,后数据库实例)
&nbs
hive函数大全及使用示例
superlxw1234
hadoop hive函数
具体说明及示例参 见附件文档。
文档目录:
目录
一、关系运算: 4
1. 等值比较: = 4
2. 不等值比较: <> 4
3. 小于比较: < 4
4. 小于等于比较: <= 4
5. 大于比较: > 5
6. 大于等于比较: >= 5
7. 空值判断: IS NULL 5
Spring 4.2新特性-使用@Order调整配置类加载顺序
wiselyman
spring 4
4.1 @Order
Spring 4.2 利用@Order控制配置类的加载顺序
4.2 演示
两个演示bean
package com.wisely.spring4_2.order;
public class Demo1Service {
}
package com.wisely.spring4_2.order;
public class