程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> SDUT 1265-馬攔過河卒(DFS)

SDUT 1265-馬攔過河卒(DFS)

編輯:C++入門知識

SDUT 1265-馬攔過河卒(DFS)


馬攔過河卒

Time Limit: 3000ms Memory limit: 65536K 有疑問?點這裡^_^

題目描述

棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上C點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為“馬攔過河卒”。棋盤用坐標表示,A點(0,0)、B點(n,m)(n,m為不超過15的整數),同樣馬的位置坐標是需要給出的。現在要求你計算出卒從A點能夠到達B點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。

輸入

一行四個數據,用空格分隔,分別表示B點的坐標和馬的坐標。

輸出

一個數據,表示所有的路徑條數。

示例輸入

6 6 3 3

示例輸出

6
sad 寫了好久。。接近一個小時,一開始居然把馬的范圍初始化錯了。。
首先生成地圖,然後掛掉馬的范圍(8個點) ,然後爆搜就可以了。
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
int n,m,ex,ey,ans,ma[20][20];
bool vis[20][20];
void dfs(int x,int y)
{
	if(x==n&&y==m)
	{
		ans++;
		return ;
	}
	if(x+1<=n&&ma[x+1][y]&&!vis[x+1][y])
	{
		vis[x+1][y]=1;
		dfs(x+1,y);
		vis[x+1][y]=0;
	}
	if(y+1<=m&&ma[x][y+1]&&!vis[x][y+1])
	{
		vis[x][y+1]=1;
		dfs(x,y+1);
	    vis[x][y+1]=0;
	}
}
int main()
{
	memset(vis,0,sizeof(vis));
	scanf("%d%d%d%d",&n,&m,&ex,&ey);
	ans=0;
	for(int i=0;i<=n;i++)
		for(int j=0;j<=m;j++)
		ma[i][j]=1;
	if(ex-1>=0&&ex-1<=n&&ey-2>=0&&ey-2<=m)ma[ex-1][ey-2]=0;
	if(ex-1>=0&&ex-1<=n&&ey+2>=0&&ey+2<=m)ma[ex-1][ey+2]=0;
	if(ex+1>=0&&ex+1<=n&&ey-2>=0&&ey-2<=m)ma[ex+1][ey-2]=0;
	if(ex+1>=0&&ex+1<=n&&ey+2>=0&&ey+2<=m)ma[ex+1][ey+2]=0;
	if(ex+2>=0&&ex+2<=n&&ey-1>=0&&ey-1<=m)ma[ex+2][ey-1]=0;
	if(ex+2>=0&&ex+2<=n&&ey+1>=0&&ey+1<=m)ma[ex+2][ey+1]=0;
	if(ex-2>=0&&ex-2<=n&&ey+1>=0&&ey+1<=m)ma[ex-2][ey+1]=0;
	if(ex-2>=0&&ex-2<=n&&ey-1>=0&&ey-1<=m)ma[ex-2][ey-1]=0;
	if(ex>=0&&ex<=n&&ey>=0&&ey<=m)ma[ex][ey]=0;
	vis[0][0]=1;
	dfs(0,0);
	printf("%d\n",ans);
	return 0;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved