POJ1683 Puzzlestan ——Floyd传递闭包+Dfs
好久没写Dfs了,拿来练手。
WA了一次,没有判断中间的情况……
解法:先用Floyd传递闭包处理哪些点一定要在一起、哪些点一定不能在一起,六重循环。
然后深搜,res[i][j]表示1,i这个物品在j这一行的匹配物品列编号。
没有最优性剪枝,只有一堆可能性剪枝:
(1)对于和(1,i)这个点关系为“一定在一起”的点(j,k),一定要将res[i,j]设置为k。
(2)即将搜索res[i][j]为k的情况是否可能,那么条件就要是(j,k)这个点与(1,i)点的关系不是“不可能在一起”,而且(j,k)这个点与所有已经和(1,i)点匹配的点的关系不是“不可能在一起”。
参考代码:
program poj1683;//By_Thispoet
const maxn=10;
varx1,y1,x2,y2 :longint;i,j,m,n,p,q,test :longint;map :array[0..maxn,0..maxn,0..maxn,0..maxn]of integer;res :array[0..maxn,0..maxn]of integer;v :array[0..maxn,0..maxn]of boolean;ch :array[0..maxn,0..maxn]of char;c,cc :char;flag :boolean;procedure printf();
beginfor i:=1 to m do beginfor j:=1 to n do write(ch[j,res[i,j]]);writeln;end;writeln;
end;procedure dfs(code,pos:longint);var i,j,k:longint;beginif code=n+1 then beginprintf();flag:=true;exit;end;if res[pos,code]<>-1 then beginif pos+1<=m then dfs(code,pos+1) else dfs(code+1,1);exit;end;if flag then exit;for i:=1 to m do if (not v[code][i])and(map[1,pos,code,i]<>2) then beginfor j:=code+1 to n do for k:=1 to m do if (map[code,i,j,k]=1)and(res[pos,j]<>-1)then beginflag:=true;break;end;for j:=1 to code-1 do if map[code,i,j,res[pos,j]]=2 then beginflag:=true;break;end;if flag then begin flag:=false; continue; end;v[code][i]:=true;res[pos,code]:=i;for j:=code+1 to n do for k:=1 to m do if (map[code,i,j,k]=1) then beginres[pos,j]:=k;v[j,k]:=true;break;end;if pos+1<=m then dfs(code,pos+1) else dfs(code+1,1);if flag then exit;for j:=code+1 to n do for k:=1 to m do if map[code,i,j,k]=1 then beginres[pos,j]:=-1;v[j,k]:=false;break;end;v[code][i]:=false;res[pos,code]:=-1;end;
end;beginreadln(test);while test>0 do beginreadln(n,m);filldword(map,sizeof(map)shr 2,0);fillchar(res,sizeof(res),255);for i:=1 to n do beginfor j:=1 to m do read(ch[i][j]);readln;end;flag:=false;readln(x1,y1,cc,c,cc,x2,y2);while not (x1=0) do beginif c='R' then beginmap[x1,y1,x2,y2]:=1;map[x2,y2,x1,y1]:=1;end else beginmap[x1,y1,x2,y2]:=2;map[x2,y2,x1,y1]:=2;end;readln(x1,y1,cc,c,cc,x2,y2);end;for p:=1 to n do for q:=1 to m dofor x1:=1 to n do for y1:=1 to m dofor x2:=1 to n do for y2:=1 to m dobeginif (map[x1,y1,p,q]=1)and(map[x2,y2,p,q]=2) then map[x1,y1,x2,y2]:=2;if (map[x1,y1,p,q]=2)and(map[x2,y2,p,q]=1) then map[x1,y1,x2,y2]:=2;if (map[x1,y1,p,q]=1)and(map[x2,y2,p,q]=1) then map[x1,y1,x2,y2]:=1;end;fillchar(v,sizeof(v),0);for i:=1 to m do res[i,1]:=i;for i:=1 to m do for p:=2 to n do for q:=1 to m doif map[1,i,p,q]=1 then begin res[i,p]:=q; v[p,q]:=true; end;dfs(1,1);dec(test);end;
end.
转载于:https://www.cnblogs.com/Thispoet/archive/2011/11/01/2232041.html
POJ1683 Puzzlestan ——Floyd传递闭包+Dfs相关推荐
- POJ 3660 Cow ContestCow(Floyd传递闭包)题解
题意:给出m个关系,问你能确定机头牛的排名 思路:要确定排名那必须要把他和其他n-1头牛比过才行,所以Floyd传递闭包,如果赢的+输的有n-1就能确定排名. 代码: #include<cstd ...
- POJ 3275 Ranking the Cows (floyd传递闭包)
Ranking the Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 2248 Accepted: 1045 ...
- POJ - 1094 Sorting It All Out(拓扑排序+floyd传递闭包)
题目链接:点击查看 题目大意:给出N个点以及M个比较关系,问在第几个数字可以确定出唯一的序列,或者判断出矛盾的序列,或者最后也无法确定出一个唯一的序列 题目分析:关于这个题目可以直接分类讨论,可以直接 ...
- 【POJ - 2594】Treasure Exploration(floyd传递闭包 + 最小路径覆盖,图论)
题干: Have you ever read any book about treasure exploration? Have you ever see any film about treasur ...
- CIA3 NOI接站(tarjan缩环+Floyd传递闭包+可相交最小路径覆盖)
可以发现,题目求得就是一个可相交最小路径覆盖,但是有环.所以我们先用tarjan把环都缩掉,然后Floyd传递闭包,求二分图最大匹配,答案就是scc-ans. #include <cstdio& ...
- 【BZOJ5335】【TJOI2018】—智力竞赛(floyd传递闭包+二分图匹配)
传送门 可以二分变成直接求最大链覆盖,因为可以重复经过一个点 floydfloydfloyd传递闭包就可以了 #include<bits/stdc++.h> using namespace ...
- H - Cow Contest POJ - 3660(Floyd 传递闭包)
H - Cow Contest POJ - 3660 题意: 有 n 头牛比赛,边 1 -> 2 代表 1 能赢 2 ,给你 m 条边,问能确定出多少头牛的名次? 思路: 如果 1->2 ...
- uva 247(floyd传递闭包)
为什么,逗号后面,还有空格........ #include <iostream> #include <cstring> #include <algorithm> ...
- 【图论专题】Floyd算法及其扩展应用
Floyd的拓展应用: 任意两点最短路 传递闭包 找最小环 恰好经过k条边的最短路(倍增) 题目列表: 题目 算法 AcWing 1125. 牛的旅行 任意两点最短路Floyd AcWing 343. ...
最新文章
- a href=# 与javascript:void(0)的区别
- Linux(服务器编程):25---epoll复用技术实现统一处理信号事件源
- indy9 indy10 MD5 实现方法
- python从入门到精通-Python从入门到精通,跟着《这本书》学就够了?
- failed building wheel for termcolor_【零基础学Python】For循环和RANGE()函数
- SIGPIPE 13 和其他信号的对照表
- 跑赢业务的同时如何实现技术成长? | 凌云时刻
- [转]余弦cos计算相似度
- FFmpeg进行推流的两种方法
- java逻辑与或非_Java基础——逻辑运算符与或非
- 【演讲之路】钱塘TMC互联网思维分享会
- linux查看串口信息tty*
- 骨传导耳机是什么意思?骨传导耳机工作原理是什么
- Python学习初阶:Python基本介绍及常用数据类型
- 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
- 设计模式3-软件设计原则
- 计算机的键盘分别代表什么,键盘中的三个指示灯分别代表什么意思
- 6580 8.1 mtp模式,查看手机容量大小修改
- 香港在线下和线上以科技呈献缤纷耀眼的圣诞
- JAVA Web学习笔记15 mybatis之查看详情 条件查询