天天看點

POJ3050前言一、題目大意二、解題思路三、AC代碼總結

文章目錄

  • 前言
  • 一、題目大意
    • 1.輸入
    • 2.輸出
  • 二、解題思路
  • 三、AC代碼
  • 總結

前言

POJ題解這一系列文章主要記錄《挑戰程式設計程式設計》的課後習題,包括解題需要用到的知識,思路以及遇到的問題等等。

提示:以下是本篇文章正文内容,下面案例可供參考

一、題目大意

給定一個5*5大小的數字矩陣,從這個矩陣的任意一點出發,向前後左右四個方向移動(可以走回頭路),總共移動五次。将移動時經過數字連接配接成串(包括起點數字),計算總共能形成多少種不同的串(數字0可以放在任何地方)。

1.輸入

一個5*5的數字矩陣

2.輸出

移動五次能形成不同數字串的個數

二、解題思路

因為我們需要窮舉所有可能的移動方式,是以可以采用深度優先算法(DFS)來周遊所有可能的路徑。在統計不同數字串的數量時,我們可以将數字串先轉化為一個整數,再将其存放到set容器中。最後,列印set的尺寸即可。

set容器相關見: set容器及常見操作.

三、AC代碼

代碼如下(示例):

#include<iostream>
#include<set>
using namespace std;
int grid[5][5];//5*5三個月左右
int dx[4]={-1,0,1,0};//x軸方向的移動
int dy[4]={0,-1,0,1};//y軸方向的移動
//x+dx[i],y+dy[i]用于控制上下左右的移動
int res = 0;
set<int> s;
void dfs(int x,int y,int sum,int step){//
	if(step==5){//當移動五步後,将生成的數字串加入到set中
		s.insert(sum);
		return;
	}
	for(int i=0;i<4;i++){
		int nx = x +dx[i];
		int ny = y +dy[i];
		if(nx>=0&&nx<5&&ny>=0&&ny<5){
			dfs(nx,ny,sum*10+grid[nx][ny],step+1);//sum*10+grid[x][y]用于将數字串轉化成數字
		}
	}
}

int main(){
	for(int i=0;i<5;i++){
		for(int j=0;j<5;j++){
			scanf("%d",&grid[i][j]);
		}
	}
	for(int x =0;x<5;x++){
		for(int y=0;y<5;y++){
			dfs(x,y,grid[x][y],0);//将5*5矩陣的每一個格子都進行DFS操作
		}
	}
	res=s.size();//s.size()就是不同數字串的數量
	printf("%d\n",res);
	}

           

總結

本文用深度優先算法配合set容器的方式來對POJ3050進行解答,窮舉了所有可能的排列,時間複雜度較高,但是較容易想到。