超級英雄Hero

超級英雄Hero

入門OJ傳送門php

題目

Description
如今電視臺有一種節目叫作超級英雄,大概的流程就是每位選手到臺上回答主持人的幾個問題,而後根據回答問題的多少得到不一樣數目的獎品或獎金。主持人問題準備了若干道題目,只有當選手正確回答一道題後,才能進入下一題,不然就被淘汰。爲了增長節目的趣味性並適當下降難度,主持人總提供給選手幾個「錦囊妙計」,好比求助現場觀衆,或者去掉若干個錯誤答案(選擇題)等等。
這裏,咱們把規則稍微改變一下。假設主持人總共有m道題,選手有n種不一樣的「錦囊妙計」。主持人規定,每道題均可以從兩種「錦囊妙計」中選擇一種,而每種「錦囊妙計」只能用一次。咱們又假設一道題使用了它容許的錦囊妙計後,就必定能正確回答,順利進入下一題。如今我來到了節目現場,但是我實在是太笨了,以致於一道題也不會作,每道題只好藉助使用「錦囊妙計」來經過。若是我事先就知道了每道題可以使用哪兩種「錦囊妙計」,那麼你能告訴我怎樣選擇才能經過最多的題數嗎?
Input
一行是兩個正整數n和m(0 < n <1001,0 < m < 1001)表示總共有n中「錦囊妙計」,編號爲0~n-1,總共有m個問題。
如下的m行,每行兩個數,分別表示第m個問題能夠使用的「錦囊妙計」的編號。
注意,每種編號的「錦囊妙計」只能使用一次,同一個問題的兩個「錦囊妙計」可能同樣。
Output
第一行爲最多能經過的題數p
Sample Input
5 6
3 2
2 0
0 3
0 4
3 2
3 2
Sample Output
4c++

題意

看題目仍是挺簡單的,也A了
有M組數據,每組數據的兩個數表明兩種選擇
也就是在0~n-1的數中,每組數據要麼作第一種選擇,要麼作第二種選擇
0~n-1的數中選過的數不能選第二次數組

思路

概況

大概就是用一個兩層的二維數組存圖,而後作DFS搜索
(見圖1)spa

座標

咱們能夠發現座標變化能夠分爲在第一行的兩種和第二行的兩種(紅色和綠色箭頭),但咱們能夠經過越界判斷給第一行和第二行都統一爲三種變化(x+1,y-1),(x+1,y+0)(x+1,y+1)(藍色箭頭)
(見圖2)3d

標記

這裏用v[N]來標記0~n-1的數是否選過,使選過的數不選第二次code

在這裏插入圖片描述

代碼

//超級英雄Hero
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[1010][5];
int dir[3][2]={{1,-1},{1,0},{1,1}};
int ans,mx;
int v[1010];

void DFS(int x,int y){
	
	//cout<<"座標"<<x<<" "<<y<<endl;
	
	v[a[x][y]]=1;
	ans++;
	//cout<<"ans:"<<ans<<endl;
	
	for(int i=0;i<=2;i++){
		int tx=dir[i][0]+x;
		int ty=dir[i][1]+y;
		if(tx>=1&&tx<=m&&ty>=1&&ty<=2&& v[ a[tx][ty] ] != 1 ){
			DFS(tx,ty);	
		}else{
			mx=max(mx,ans);
			//cout<<mx<<"mx--ans"<<ans<<endl;
		}
		
		
	}
	ans=0;
	
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>a[i][1]>>a[i][2];
	}
	DFS(1,1);
	for(int i=0;i<=n;i++){
		v[i]=0;
	}
	ans=0;
	DFS(2,1);
	cout<<mx;
	
	return 0;
}
相關文章
相關標籤/搜索