标签:which vertica namespace ace dir i++ open his ini
Description
Input
Output
Sample Input
4 .X.. .... XX.. .... 2 XX .X 3 .X. X.X .X. 3 ... .XX .XX 4 .... .... .... .... 0
Sample Output
5 1 5 2 4
思路就是dfs+回溯,但是回溯时候标记的消去要注意,别把上层或上层以上的标记消去。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<stack> #include<stdlib.h> #include<map> #include<vector> #include<queue> #include<set> #include<ctype.h> #define zuida 100000 using namespace std; #define INF 0x3f3f3f3f char zh[10][10]; int vis[10][10]; int maxn=0;int n; void dfs(int a,int b,int c) { int i,j; maxn=max(maxn,c); for(i=a;i<n;i++) for(j=0;j<n;j++) { if(zh[i][j]==‘.‘&&!vis[i][j]) { int k; for(k=i;k<n;k++) { if(zh[k][j]==‘X‘)break; vis[k][j]++; } for(k=i;k>=0;k--) { if(zh[k][j]==‘X‘)break; vis[k][j]++; } for(k=j;k<n;k++) { if(zh[i][k]==‘X‘)break; vis[i][k]++; } for(k=j;k>=0;k--) { if(zh[i][k]==‘X‘)break; vis[i][k]++; } dfs(i,j,c+1); for(k=i;k<n;k++) { if(zh[k][j]==‘X‘)break; vis[k][j]--; } for(k=i;k>=0;k--) { if(zh[k][j]==‘X‘)break; vis[k][j]--; } for(k=j;k<n;k++) { if(zh[i][k]==‘X‘)break; vis[i][k]--; } for(k=j;k>=0;k--) { if(zh[i][k]==‘X‘)break; vis[i][k]--; } } } } int main() { while(cin>>n&&n) { maxn=0; int i,j; memset(vis,0,sizeof(vis)); for(i=0;i<n;i++) { getchar(); for(j=0;j<n;j++) cin>>zh[i][j]; } for(i=0;i<n;i++) for(j=0;j<n;j++) dfs(i,j,0); cout<<maxn<<endl; } }
大佬标记的简化用了一个函数
const int Dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}}; int N,Ans,HashMap[10][10]; char Map[10][10]; void UpdateHashMap(int Row,int Col,int Val) { for(int n=0;n<4;++n) { int tmprow=Row; int tmpcol=Col; while(1) { if(!(0<=tmprow&&tmprow<N)) { break; } if(!(0<=tmpcol&&tmpcol<N)) { break; } if(Map[tmprow][tmpcol]!=‘.‘) { break; } HashMap[tmprow][tmpcol]+=Val; tmprow+=Dir[n][0]; tmpcol+=Dir[n][1]; } } }
标签:which vertica namespace ace dir i++ open his ini
原文地址:https://www.cnblogs.com/SparkPhoneix/p/8782699.html