一笔画

数据结构填坑

痞子三分冷 提交于 2020-01-12 04:22:17
文章目录 小战士过火线 静态链表 打印字符串 出栈顺序 图的基本操作 一笔画求解 原地归并排序 把之前立下的flag补完,太懒了,有好多好多东西没写。 小战士过火线 /** * 通过逆操作来复原 * * 因为要进行尾删除和头插入操作,所以采取链表来来存储 */ #include <stdio.h> #include <stdlib.h> /* 存储战士信息 */ typedef struct node { int value; //1代表老战士,2代表新战士 struct node *next; } NODE; typedef NODE *List; List init(); //初始化队列 int deleteLastNode(List L); //删除并返回最后在一个值 void addNode(List L, int value); //在对头添加一个节点 void printAns(List L); //打印结果 int main() { List L = init(); for (int i = 0; i < 4; i++) { addNode(L,deleteLastNode(L)); //把最后一个节点移动到开头 addNode(L,0); //先是小战士 addNode(L,1); //再是老战士 } printAns(L); return 0; } List

一笔画问题(欧拉回路)

匿名 (未验证) 提交于 2019-12-03 00:22:01
描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。 规定,所有的边都只能画一次,不能重复画。 输入 第一行只有一个正整数N(N<=10)表示测试数据的组数。 每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线。(点的编号从1到P) 随后的Q行,每行有两个正整数A,B(0<A,B<P),表示编号为A和B的两点之间有连线。 输出 如果存在符合条件的连线,则输出"Yes", 如果不存在符合条件的连线,输出"No"。 样例输入 2 4 3 1 2 1 3 1 4 4 5 1 2 2 3 1 3 1 4 3 4 样例输出 No Yes #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int pre[1005],s[1005];//s记录每个节点的度 int find(int x) //寻找x根节点 { if(x!=pre[x]) pre[x]=find(pre[x]); return pre[x]; } void fun(int x,int y) //合并两个分支 { if(find(x)!=find(y)) { pre[find(y)]=find(x);

javascript 解 一笔画游戏

爱⌒轻易说出口 提交于 2019-12-02 05:26:48
偶然玩到这个游戏,十几关过去后就比较头疼了,于是写了个解题程序。。。 分析游戏: 游戏由 点、线(点与点之间的关系)构成。规则:不能走重复路径;所有线走完则过关。 解题方式是递归遍历所有路径,暴力破解一样。 思路: 两个类 Pointer、Line。 Pointer属性:no编号,orientations方向(数组,所有与点连接的点编号),equals()比较节点是否为同一个节点。 Line属性:p1编号小的点,p2编号大的点。 使用多线程以每个节点为初始点开始递归遍历,走一步删除走过的线,某节点遍历完仍无解则还原被删除的线。解题成功则修改全局变量PATH,如果有其它线程解题成功(PATH非空)则直接returne,直至退出当前线程。 代码: //点 function Pointer(no, orientation) { if (isNaN(no) || typeof orientation != 'string' || orientation == "") { console.info("no:" + no + " orientation:" + orientation); throw new Error("非法参数"); }; this.no = no; this.orientations = orientation.split(',').sort(function(a, b)

【模板】欧拉回路(一笔画问题)

末鹿安然 提交于 2019-11-30 23:13:44
(摘自https://www.cnblogs.com/abc1604831024/p/9077112.html) 欧拉回路 就是给一个图, 存在一条回路把所边经过且每条边只经过一次 。 对于 无向图 :   存在欧拉回路的条件: 每个点的度都为偶数 ;   存在欧拉路的条件: 有且只有两个点的度为一,且这两个点分别为起点和终点 ; 对于 有向图 :   存在欧拉回路的条件: 每个点出度等于入度 ;   存在欧拉路的条件: 存在一个点出度比入度多一作为起点,存在一点入度比出度多一作为终点,其余点出度等于入度 ; 求欧拉回路的方法—— 基本(套圆)法    dfs搜索,不能再往下走便回溯,回溯时记录路径,回溯时不清除对边的标记,最后求出来的路径就是欧拉回路。 举例 (1)走<1,2>,<2,3>,<3,4>,<4,5>,<5,1>,然后无路可走,就回溯记录下回溯路径<1,5>,<5,4>,4点有其它路壳走。 (2)<4,8>,<8,3>,<3,6>,<6,7>,<7,2>,<2,4>,无路可走,然后回溯<1,5>,<5,4>,<4,2>,<2,7>,<7,6>,<6,3>,<3,8>,<8,4>,<4,3>,<3,2>,<2,1>。 记录下的路径<1,5>,<5,4>,<4,2>,<2,7>,<7,6>,<6,3>,<3,8>,<8,4>,<4,3>,<3,2>,<2,1

1341:【例题】一笔画问题

会有一股神秘感。 提交于 2019-11-28 04:05:23
【题目描述】 如果一个图存在一笔画,则一笔画的路径叫做欧拉路,如果最后又回到起点,那这个路径叫做欧拉回路。 根据一笔画的两个定理,如果寻找欧拉回路,对任意一个点执行深度优先遍历;找欧拉路,则对一个奇点执行dfs,时间复杂度为O(m+n),m为边数,n是点数。 【输入】 第一行n,m,有n个点,m条边,以下m行描述每条边连接的两点。 【输出】 欧拉路或欧拉回路,输出一条路径即可。 【输入样例】 5 5 1 2 2 3 3 4 4 5 5 1 【输出样例】 1 5 4 3 2 1欧拉路度数是奇数时是起点(或终点)。欧拉回路时任何路都可以 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 10000+1 4 int w[N][N],du[N],n,m,ans[N],tot; 5 void dfs(int x) 6 { 7 for(int i=1;i<=n;i++) 8 if(w[x][i]) 9 { 10 w[x][i]=w[i][x]=0; 11 dfs(i); 12 break; 13 } 14 ans[++tot]=x; 15 } 16 int main() 17 { 18 cin>>n>>m; 19 for(int i=1;i<=m;i++) 20 { 21 int x,y; 22 cin>>x>>y; 23