從1-12中從小到大選取5個數(DFS)
BFS判斷找出來的5個數是否連通:以任意一個(我的程序取得是最小的)為起點,BFS搜索 是否可以搜索到5個 如果可以 說明是連通的
#include<iostream> #include<stdio.h> #include<cmath> #include<queue> using namespace std; int a[13] = { 0 };//dfs int l[5];//存儲已經 找到的5個數 int sum = 0; typedef struct node{ int x, y; struct node(){ x = -1; y = -1; } struct node(int xx, int yy){ x = xx; y = yy; } }Node; bool ok(){//bfs判斷找到的5個數是否連通 int arr[3][4];//存儲剪切矩陣 int flag[3][4]; for (int i = 0; i<3; i++){ for (int j = 0; j<4; j++){ arr[i][j] = 0;//bfs過程中標記是否可訪問 flag[i][j] = 0;//bfs過程中標記是否已經訪問 } } for (int i = 0; i<5; i++){ arr[(l[i]-1)/4][(l[i]-1)%4]= 1; } /*cout << "arr:" << endl; for (int i = 0; i<3; i++){ for (int j = 0; j<4; j++){ cout << arr[i][j]; cout << " "; } cout << endl; }*/ int dir[4][2]{//上下左右方向控制 { -1, 0}, { 1, 0 }, { 0, -1 }, { 0, 1 } }; queue<Node> q; Node vs((l[0] - 1) / 4, (l[0] - 1) % 4); flag[vs.x][vs.y] = 1; q.push(vs); int ssum = 1; Node vn, vw; while (q.empty() == false){ vn = q.front(); q.pop(); for (int i = 0; i<4; i++){ vw.x = vn.x + dir[i][0]; vw.y = vn.y + dir[i][1]; //cout << vw.x << vw.y << endl; /*cout << "flag:" << endl; for (int i = 0; i<3; i++){ for (int j = 0; j<4; j++){ cout << flag[i][j]; cout << " "; } cout << endl; }*/ //getchar(); if (vw.x >= 0 && vw.x <= 2 && vw.y >= 0 && vw.y <= 3){ if (flag[vw.x][vw.y] == 0 && arr[vw.x][vw.y] == 1){//如果改點未訪問過 且該點可訪問 flag[vw.x][vw.y] = 1;//標記該節點已經訪問過 q.push(vw); ssum++; } } } } //cout << ssum << endl; if (ssum == 5) return true; return false; } void dfs(int x){ if (x>1 && (l[x - 1]<l[x - 2])) return;//遞減就不要 if (x == 5&&ok()){ /*for (int i = 0; i<5; i++){ printf(" %d", l[i]); } printf("\n");*/ sum = sum + 1; //printf("打印%d\n",sum); return; } if (x == 5) return; for (int i = 1; i<13; i++){ if (a[i] == 0){ l[x] = i; a[i] = 1; dfs(x + 1); a[i] = 0; } } } int main(){ dfs(0); cout << sum << endl; }