水题栏:虽然一遍过(毕竟水题),但是还是把代码贴上。
1 #include<iostream> 2 #include<cstdio> 3 #include<ctime> 4 #include<cstring> 5 #include<cstdlib> 6 #include<cmath> 7 #include<queue> 8 #include<stack> 9 #include<map> 10 #include<algorithm> 11 #define Max(a,b) ((a)>(b)?(a):(b)) 12 #define Min(a,b) ((a)<(b)?(a):(b)) 13 #define Mem0(x) memset(x,0,sizeof(x)) 14 #define Mem1(x) memset(x,-1,sizeof(x)) 15 #define MemX(x) memset(x,0x3f,sizeof(x)) 16 using namespace std; 17 typedef long long ll; 18 const int inf=0x3f3f3f; 19 const double pi=acos(-1.0); 20 21 int ans,n,k,a[30]; 22 bool vis[30]; 23 bool check(int n) 24 { 25 if (n==1) 26 return false; 27 for (int i=2;i*i<=n;i++){ 28 if (n%i==0) 29 return false; 30 } 31 return true; 32 } 33 void dfs(int pos,int index,int sum) 34 { 35 if (index==k){ 36 if (check(sum)){ 37 ans++; 38 } 39 return ; 40 } 41 if (pos>n) 42 return ; 43 for (int i=pos;i<=n;i++){ 44 if (vis[i]==false){ 45 vis[i]=true; 46 dfs(i+1,index+1,sum+a[i]); 47 vis[i]=false; 48 } 49 } 50 } 51 int main() 52 { 53 ans=0; 54 cin>>n>>k; 55 for (int i=1;i<=n;i++){ 56 cin>>a[i]; 57 } 58 dfs(1,0,0); 59 cout<<ans<<endl; 60 return 0; 61 }
***************************************************************分割线***************************************************************
这里为了图时间的简便,可以从最外围的0开始搜索,被搜到的全部赋值为-1,等搜索结束后剩下的零就全是应被涂成2的。
最后记得输出的时候,被标记为-1的点按0输出。
1 #include<iostream> 2 #include<cstdio> 3 #include<ctime> 4 #include<cstring> 5 #include<cstdlib> 6 #include<cmath> 7 #include<queue> 8 #include<stack> 9 #include<map> 10 #include<algorithm> 11 #define Max(a,b) ((a)>(b)?(a):(b)) 12 #define Min(a,b) ((a)<(b)?(a):(b)) 13 #define Mem0(x) memset(x,0,sizeof(x)) 14 #define Mem1(x) memset(x,-1,sizeof(x)) 15 #define MemX(x) memset(x,0x3f,sizeof(x)) 16 using namespace std; 17 typedef long long ll; 18 const int inf=0x3f3f3f; 19 const double pi=acos(-1.0); 20 21 22 int n; 23 struct s{ 24 int x,y,num; 25 }mp[50][50]; 26 const int dir[4][2]={1,0,0,1,-1,0,0,-1}; 27 queue <s> q; 28 void init() 29 { 30 while (!q.empty()) 31 q.pop(); 32 cin>>n; 33 for (int i=1;i<=n;i++){ 34 for (int j=1;j<=n;j++){ 35 cin>>mp[i][j].num; 36 mp[i][j].x=i; 37 mp[i][j].y=j; 38 if ((i==1||i==n||j==1||j==n)&&mp[i][j].num==0) 39 q.push(mp[i][j]); 40 } 41 } 42 return ; 43 } 44 void bfs() 45 { 46 s node,temp; 47 while (!q.empty()){ 48 node=q.front(); 49 mp[node.x][node.y].num=-1; 50 for (int k=0;k<4;k++){ 51 temp.x=node.x+dir[k][0]; 52 temp.y=node.y+dir[k][1]; 53 if (temp.x<1||temp.y<1||temp.x>n||temp.y>n||mp[temp.x][temp.y].num==1) 54 continue; 55 else if (mp[temp.x][temp.y].num==0){ 56 q.push(temp); 57 } 58 } 59 q.pop(); 60 } 61 return ; 62 } 63 void Print() 64 { 65 for (int i=1;i<=n;i++){ 66 for (int j=1;j<=n;j++){ 67 if (mp[i][j].num==-1) 68 cout<<"0 "; 69 else if (mp[i][j].num==0) 70 cout<<"2 "; 71 else 72 cout<<"1 "; 73 } 74 cout<<endl; 75 } 76 } 77 int main() 78 { 79 init(); 80 bfs(); 81 Print(); 82 return 0; 83 }
***************************************************************分割线***************************************************************
1 #include<iostream> 2 #include<cstdio> 3 #include<ctime> 4 #include<cstring> 5 #include<cstdlib> 6 #include<cmath> 7 #include<queue> 8 #include<stack> 9 #include<map> 10 #include<algorithm> 11 #define Max(a,b) ((a)>(b)?(a):(b)) 12 #define Min(a,b) ((a)<(b)?(a):(b)) 13 #define Mem0(x) memset(x,0,sizeof(x)) 14 #define Mem1(x) memset(x,-1,sizeof(x)) 15 #define MemX(x) memset(x,0x3f,sizeof(x)) 16 using namespace std; 17 typedef long long ll; 18 const int inf=0x3f3f3f; 19 const double pi=acos(-1.0); 20 21 int n,ans[20]; 22 bool vis[20]; 23 void Print() 24 { 25 for (int i=1;i<=n;i++){ 26 printf("%5d",ans[i]); 27 } 28 cout<<endl; 29 return ; 30 } 31 void dfs(int index) 32 { 33 if (index==n+1){ 34 Print(); 35 return ; 36 } 37 for (int i=1;i<=n;i++){ 38 if (vis[i]==false){ 39 vis[i]=true; 40 ans[index]=i; 41 dfs(index+1); 42 vis[i]=false; 43 } 44 } 45 return ; 46 } 47 int main() 48 { 49 cin>>n; 50 dfs(1); 51 return 0; 52 }
***************************************************************分割线***************************************************************
在这里只需要明白DFS序问题,无论是 先 / 中 / 后 序排列,对于一颗完整的子树,他们的序列都是连着的。
1 #include<iostream>
2 #include<cstdio> 3 #include<ctime> 4 #include<cstring> 5 #include<cstdlib> 6 #include<cmath> 7 #include<queue> 8 #include<stack> 9 #include<map> 10 #include<algorithm> 11 #define Max(a,b) ((a)>(b)?(a):(b)) 12 #define Min(a,b) ((a)<(b)?(a):(b)) 13 #define Mem0(x) memset(x,0,sizeof(x)) 14 #define Mem1(x) memset(x,-1,sizeof(x)) 15 #define MemX(x) memset(x,0x3f,sizeof(x)) 16 using namespace std; 17 typedef long long ll; 18 const int inf=0x3f3f3f; 19 const double pi=acos(-1.0); 20 21 char s[30],t[30]; 22 int len; 23 void btree(int l,int r,int L,int R) 24 { 25 if (l>r) 26 return ; 27 cout<<t[R]; 28 int cnt=l; 29 while (s[cnt]!=t[R]) 30 cnt++; 31 int temp=cnt-l; 32 btree(l,cnt-1,L,L+temp-1); 33 btree(cnt+1,r,L+temp,R-1); 34 } 35 int main() 36 { 37 cin>>s+1>>t+1; 38 len=strlen(s+1); 39 btree(1,len,1,len);
40 }
***************************************************************分割线***************************************************************