来自华为OJ的一道题:笔画
描述 | |
---|---|
知识点 | 链表,队列,栈,树,图,数组 |
运行时间限制 | 10M |
内存限制 | 128 |
输入 | 1、输入点的个数 2、输入点的坐标 |
输出 | 如果可以一笔画这输出 画线顺序 |
样例输入 | 3 1 2 1 3 2 3 |
样例输出 | true |
【思路】:根据输入构造邻接矩阵(需要祛除重复的边)
如A(-1,0),B(0,0), C(1,0) ,D(0,1)需要删除A和C之间的连接。
【伪代码】
main(){
int flag=0;
for(int i=1;i<=N;i++){
//判定从i开始是否可以一笔画出来
// visited
visited=string(N,'0');
if(f(visited,edge,i))
flag=1;break;
}
cout<<flag<<endl;
}
bool f(string visited,vector<vector<bool> > edge,int staNode){
visited[staNode]='1';
//检验节点是否已全被探索
-->是,return 1;
-->否,继续
// 获取 从staNode出发可以达到的节点集合
vector<int> conNodes = getOptionalNodes(edge,staNode);//此时conNodes: 与staNode相连的节点集一定不为空
for(int j=0;j<conNodes.size();j++){
//对每一个与staNode相连的节点
edge[conNodes[j]][staNode]=0;//已被探索,不能重复走,规定1表示有边可走
edge[staNode][conNodes[j]]=0;//已被探索,不能重复走
if(f(visited,edge,conNodes[j]))
return 1;
}
return 0;
}