SHUOJ 1556三角迷宫(DFS)

题目:SHUOJ-1556

题目链接:http://202.121.199.212/JudgeOnline/problem.php?id=1556

题目:

1556: 三角迷宫

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 309   Solved: 226
[ Submit][ Status][ Web Board]

Description

这里有45个数字组成的一个三角阵,数字分别是1、2、3、...、9不等。要求你每次从顶点A处开始,一步步地通过它相邻的数字走到对边为止:但是一定要全部通过1,2,3,....,9这些数字,缺一不可,顺序不限,也不得重复,更不许走回头路。
                A 1
                  3 6
                9 7 8
              2 6 3 9
             3 1 5 8 5
           5 9 4 6 3 2
          8 3 2 9 4 9 1
         6 5 7 4 1 2 8 7
       7 1 4 8 7 4 5 6 2
对上述三角迷宫,我们可以找到一条路线,A 处:139654278。你能找出这一条路线来吗?

Input

输入有若干组测试数据,其第一行是整数n,表示三角迷宫的个数。接着有n 组测试数据,每一组是一个三角迷宫的描述,共9 行,第i 行上有i 个1 到9 之间的数字符号,i=1,2,„,9,每行上的数字符号之间有一个空格。两个三角迷宫之间有一个空行。

Output

对输入中描述的每组三角迷宫,确定从顶点A 出发,可否一步步地通过它相邻的数字走到对边为止,使路径上包含1,2,3„9 这全部9 个数字,顺序不限,不要重复,不许走回头路。先输出“Case#:”,其中“#”是三角迷宫的组号。如果从该顶点出发,可以确定这样的路线,则在下一行上输出“Possible”,否则输出“Impossible”。

Sample Input

2
1
3 6
9 7 8
2 6 3 9
3 1 5 8 5
5 9 4 6 3 2
8 3 2 9 4 9 1
6 5 7 4 1 2 8 7
7 1 4 8 7 4 5 6 2

4
3 6
9 7 8
2 6 3 9
3 1 5 8 5
5 9 4 6 3 2
8 3 2 9 4 9 1
6 5 7 4 1 2 8 7
7 1 4 8 7 4 5 6 2

Sample Output

Case 1:
Possible
Case 2:
Impossible
额,DFS,注意走的是相邻的路。。。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<math.h> 
using namespace std;
const int maxn=10;
int n,m;
int map[maxn][maxn];
int visit[maxn][maxn];
int vis[maxn];
bool ans=0;
int t;
void dfs(int x,int y){
	if(ans==1) return;
	if(x==9){
		ans=1;
		return;
	}
	
	for(int j=y;j<=y+1;j++){
		if(vis[map[x+1][j]]==0 && visit[x+1][j]==0){
			vis[map[x+1][j]]=x;
			visit[x+1][j]=1;
			dfs(x+1,j);
			visit[x+1][j]=0;
			vis[map[x+1][j]]=0;
		}
	}
}
int main(){
	int count=1;
	cin>>t;
	while(t--){
		for(int i=1;i<=9;i++){
			for(int j=1;j<=i;j++){
				visit[i][j]=0;
				cin>>map[i][j];
			}
			vis[i]=0;
		}
		ans=0;
		vis[map[1][1]]=1;
		dfs(1,1);
		cout<<"Case "<<count++<<":"<<endl;
		if(ans==1)
			cout<<"Possible"<<endl;
		else
			cout<<"Impossible"<<endl;
			
	}
	return 0;
}

Come on!


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作者写点废话哈: 1、先是看到手机上有个小游戏,填字游戏,横竖相连,像个迷宫 2、就用Delphi 做了个由 panel 数组 组成的迷宫,墙都是方块,丑死了。 3、再查查网上有不少迷宫样式,其中有的迷宫是单墙的,而且任意两处都是想通的。 4、再做了个四面墙都可打通的迷宫,甚至做了个斜线通道的。 5、觉得三角形迷宫更有挑战性,另外想试试以前学的数据结构指针、链表、树、连通图的知识是不是忘光了, 就做了个三角形迷宫,而且索性做成一个完善的 Delphi 控件,而且有不少属性。。。 6、有几个要解释下:1)迷宫是个连通图,每个正三角形与三个倒三角形相连,每个倒三角形与三个正三角形相连; 2)采用递归,从一个节点开始构造整个连通图;3)查找、遍历连通图时用外部二维数组标识来防止重复; 3)构造迷宫采用的是所谓 随机prim 算法;4)迷宫的宽与三角形边长、列数相互制约,迷宫的高由三角形的高 (正三角形的高通过边长计算的)与行数决定;5)使用指针时最容易丢掉 ^ 这个符号,例如某节点是 Pmm 指针型, 对其属性的引用就不能用 Pmm.Value 而必须用 Pmm^.Value ,机器编译时不会提示错误,但运行时老是出错! 6)绘图通过计算三角形的顶点坐标来构造;7)控件父类是 TGraphicControl ,试了好几种最后它最好, 要覆盖 paint 方法绘图;8)构造类时如 FGridWidth 的内部数据与属性 GridWidth 不要混淆使用, 记住 内部数据赋值,属性引用,属性(Published)是给运行期或者设计面板上别人使用的,内部数据是封装的; 9)发布自定义控件前先准备一个包含 类 一样名称的 ICO 的 DCR 文件,好像只有 Delphi7 里的 Image Editor 可以制作,这个工具包括两个文件 ImageEdit.exe 和 ImageD32.dll 两个文件 7、好像前后陆续花了近两个星期吧,终于基本完善了。该学点其他东西了 -- by chenxz
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值