SDUT 1125-New Game(DFS)

New Game

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

New game是在一个M*M的特殊棋盘(棋盘的第i行都标上了数字i)上进行的新式游戏。给定一个数字N,要求选手把一个棋子从左上角(1,1)移到右下角(M,M),移动时只能往右或往下。要求移动后经过的数字和为N,且拐弯的次数最少。

如果对给出的N,选手不能找出移动方案使得经过的数字和为N或找出的路径拐弯次数不是最少,选手就输了。所以,选手一定千方百计要找出满足条件的路径!!

输入

两个正整数M,N(其中M<=16),数据保证有解。

输出

最少拐弯数。

示例输入

4 22

示例输出

1
爆搜。。基础剪枝即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cctype>
#include <cstring>
using namespace std;
int ma[18][18],m,n,ans;
bool vis[18][18];
const int INF=0x3f3f3f3f;
int dir[2][2]={{1,0},{0,1}};
void dfs(int x,int y,bool statu,int num,int sum)
{
	//最优剪
	if(num>ans) return ;
	//可行剪
	if(sum>n) return ;
	if(x==m&&y==m)
	{
		if(sum==n)
			ans=min(ans,num);
		return ;
	}
	for(int i=0;i<2;i++)
	{
		int tx=x+dir[i][0];
		int ty=y+dir[i][1];
		if(tx>=1&&tx<=m&&ty>=1&&ty<=m&&!vis[tx][ty])
		{
			vis[tx][ty]=1;
			if(sum==1)
			dfs(tx,ty,i,num,sum+ma[tx][ty]);
			else
			{
				if(i!=statu)
					dfs(tx,ty,i,num+1,sum+ma[tx][ty]);
				else
					dfs(tx,ty,i,num,sum+ma[tx][ty]);
			}
			vis[tx][ty]=0;
		}
	}
}
void init()
{
	for(int i=1;i<=m;i++)
		for(int j=1;j<=m;j++)
			ma[i][j]=i;
}
int main()
{
    while(scanf("%d%d",&m,&n)!=EOF)
	{
		memset(vis,0,sizeof(vis));
		init();
		vis[1][1]=1;
		ans=INF;
		dfs(1,1,0,0,1);
		printf("%d\n",ans);
	}
	return 0;
}
时间: 2024-10-06 00:10:39

SDUT 1125-New Game(DFS)的相关文章

SDUT 走迷宫(DFS)

走迷宫 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数. 输入 第一行一个整数T 表示有T 组测试数据.(T <= 110) 对于每组测试数据: 第一行两个整数n, m,表示迷宫有n * m 个格子.(1 <= n, m <= 6, (n

SDUT 1269-走迷宫(DFS打印路径)

走迷宫 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,输入这m*n个数据和起始点.结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号).现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向.如果一条路都不可行,则输出相应信息(用-1表示无路). 输入 第一行是两个数m

SDUT 1157-小鼠迷宫问题(BFS&amp;DFS)

小鼠迷宫问题 Time Limit: 1500ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 小鼠a与小鼠b身处一个m×n的迷宫中,如图所示.每一个方格表示迷宫中的一个房间.这m×n个房间中有一些房间是封闭的,不允许任何人进入.在迷宫中任何位置均可沿上,下,左,右4个方向进入未封闭的房间.小鼠a位于迷宫的(p,q)方格中,它必须找出一条通向小鼠b所在的(r,s)方格的路.请帮助小鼠a找出所有通向小鼠b的最短道路. 请编程对于给定的小鼠的迷宫,计算小鼠a通向小

SDUT 1266-出栈序列的统计(DFS)

出栈序列的统计 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 栈是常用的一种数据结构,有n个元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列.你已经知道栈的操作有两种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出.现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列.请你编程求出对于给定的n,计算并输出由操作数序列1,2,--,n,经过一系列操作可能得到的输出序列总数. 输入 一个整数n(1<=n<

SDUT 1304-取数字问题(DFS)

取数字问题 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定M×N的矩阵,其中的每个元素都是-10到10之间的整数.你的任务是从左上角(1,1)走到右下角(M,N),每一步只能够向右或者向下,并且不能够走出矩阵的范围.你所经过的方格里面的数字都必须被选取,请找出一条最合适的道路,使得在路上被选取的数字之和是尽可能小的正整数. 输入 输入第1行是两个整数M和N,(2<=M<=10,2<=N<=10),分别表示矩

SDUT 1265-马拦过河卒(DFS)

马拦过河卒 Time Limit: 3000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为"马拦过河卒".棋盘用坐标表示,A点(0,0).B点(n,m)(n,m为不超过15的整数),同样马的位置坐标是需要给出的.现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固

SDUT 3297 DFS

奇妙的23点 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 题意很简单,给出5个数字,你可以使用 ' + ' ,  ' - ' , ' * '运算符(运算符没有优先级关系),使得最后计算的结果等于23,其中给出的5个数字可以任意改变顺序. 输入 输入5个数字,每个数字的大小范围为[1,50]. 输出 如果最后的运算结果可以等于23,输出Yes,不能的话输出No. 示例输入 1 1 1 1 1 1 2 3 4 5 2 3 5

SDUT 1157 小鼠迷宫问题(水题,DFS + 回溯)

小鼠迷宫问题 Time Limit: 1500ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 小鼠a与小鼠b身处一个m×n的迷宫中,如图所示.每一个方格表示迷宫中的一个房间.这m×n个房间中有一些房间是封闭的,不允许任何人进入.在迷宫中任何位置均可沿上,下,左,右4个方向进入未封闭的房间.小鼠a位于迷宫的(p,q)方格中,它必须找出一条通向小鼠b所在的(r,s)方格的路.请帮助小鼠a找出所有通向小鼠b的最短道路. 请编程对于给定的小鼠的迷宫,计算小鼠a通向小

SDUT1157:小鼠迷宫问题(bfs+dfs)

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1157 题目描述 小鼠a与小鼠b身处一个m×n的迷宫中,如图所示.每一个方格表示迷宫中的一个房间.这m×n个房间中有一些房间是封闭的,不允许任何人进入.在迷宫中任何位置均可沿上,下,左,右4个方向进入未封闭的房间.小鼠a位于迷宫的(p,q)方格中,它必须找出一条通向小鼠b所在的(r,s)方格的路.请帮助小鼠a找出所有通向小鼠b的最短道路. 请编程对于给定