题目链接:http://poj.org/problem?id=3050
题意:问从5*5的矩阵中选连续的6个(可重复)组成的字符串有多少种
思路:这也是一道规模不是太大的题目,还是暴力搜索。
难点在于判断是否有重复,一开始的想法是把字符串练成一个六位数再排序后逐个比较,(其实也可以这样做)但是这样把题目的规模就增大了,所以采用C++ STL中 set 容器。
#include <iostream> #include <algorithm> #include <cstdio> #include <set> using namespace std; int s[6][6]; int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0}; set<int> st; void dfs(int x,int y,int num,int val){ if(num==6){ st.insert(val); //set真的太好用啦,有重复数字的去重效率也很高 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){ num++; dfs(nx,ny,num,val*10+s[nx][ny]); num--; //这是一个坑,一开始老是忘记要还原,就邦邦邦的报错 } } } int main(void){ for(int i=0;i<5;i++){ for(int j=0;j<5;j++){ scanf("%d",&s[i][j]); } getchar(); } for(int i=0;i<5;i++) for(int j=0;j<5;j++) dfs(i,j,1,s[i][j]); // printf("%d\n",st.size()); cout<<st.size()<<endl; return 0; }