HDU-OJ 杭电1010
2018-01-31 00:54
387 查看
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; char a[9][9]; int table[51][51]; int visited[50]; int T; int final = 0; int n, m; int minPath; int xStart, yStart; int xEnd, yEnd; void dfs(int s,int degree){ degree++; if(visited[s] == 1) return ; if(final == 1) return ; visited[s] = 1; if(degree == T && a[(s-1)/m+1][(s-1)%m+1]=='D') final = 1; if(T - degree < abs(xEnd - ((s-1)/m+1)) + abs(yEnd - ((s-1)%m+1))){ // cout<<abs(xEnd - (s/(m+1)+1))<<" "<<abs(yEnd - (s - s/(m+1)*4)); visited[s] = 0; return ; } // cout<<"X="<<s/m + 1<<","<<"Y="<<s%m<<","<<"degree="<<degree<<endl; //查4次 { int i=s-1; int v=table[s][i]; if(v==1) dfs(i,degree); } { int i=s+1; int v=table[s][i]; if(v==1) dfs(i,degree); } { int i=s-m; int v=table[s][i]; if(v==1) dfs(i,degree); } { int i=s+m; int v=table[s][i]; if(v==1) dfs(i,degree); } visited[s] = 0; } int main(){ int Start; int end; int count; //initialize while(scanf("%d%d%d",&n,&m,&T) != EOF && n != 0 && m != 0 && T != 0){ //初始化 for(int i = 0; i < 9; i++) for(int j = 0; j < 9; j++) a[i][j] = 'X'; memset(table,0,sizeof(table)); memset(visited,0,sizeof(visited)); final = 0; count = 0; for(int i = 1; i <= n; i++){ getchar(); for(int j = 1; j <= m; j++){ scanf("%c",&a[i][j]); } } getchar(); //test // for(int i = 1; i <= n; i++){ // for(int j = 1; j <= m; j++){ // cout<<a[i][j]<<" "; // } // cout <<endl; // } // for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ if(a[i][j] == 'S'){ Start = (i-1)*m + j; xStart = i; yStart = j; } if(a[i][j] == 'D'){ end = (i-1)*m + j; xEnd = i; yEnd = j; } } } //Create a adjacency list for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ count++; if(a[i][j] == 'X') continue; if(a[i][j-1]=='.'||a[i][j-1]=='D') { table[count][count-1] = 1; } if(a[i][j+1]=='.'||a[i][j+1]=='D') { table[count][count+1] = 1; } if(a[i-1][j]=='.'||a[i-1][j]=='D') { table[count][count-m] = 1; } if(a[i+1][j]=='.'||a[i+1][j]=='D') { table[count][count+m] = 1; } } } // for(int i = 1; i <= n*m; i++){ // for(int j = 1; j <= m*n; j++){ // cout<<table[i][j]<<" "; // } // cout<<endl; // } if(T < abs(xStart - xEnd) + abs(yStart - yEnd)) cout<<"NO\n"; else if((T - abs(xStart - xEnd) - abs(yStart - yEnd)) & 1){ cout<<"NO\n"; } else{ dfs(Start,-1); if(final == 1) cout <<"YES"<<endl; else cout <<"NO"<<endl; } } return 0; }
这题风格太差 没必要邻接矩阵!很容易超时!!
下面介绍一下,我校ACM大神的算法
#include "iostream" #include "cstring" using namespace std; const int maxn = 13; char a[maxn][maxn]; int vis[maxn][maxn]; int T, n, m, final, sx, sy, ex, ey; int dx[]={1, -1, 0, 0}; int dy[]={0, 0, 1, -1}; void dfs(int x, int y, int step){ if (step > T) return; if (a[x][y] == 'D' && step == T) final = 1; if (final) return; int left = T - step, les = abs(x - ex) + abs(y - ey); if (left < les) return; if (left % 2 != les % 2) return; for (int i = 0; i < 4; i++) { int nx = x + dx[i], ny = y + dy[i]; if (nx < 0 || ny < 0 || nx >= n || ny >= m) continue; if (a[nx][ny] == 'X') continue; if (vis[nx][ny]) continue; vis[nx][ny] = 1; dfs(nx, ny, step + 1); vis[nx][ny] = 0; } } int main(){ #ifdef AC freopen("data.txt", "r", stdin); #endif while(scanf("%d%d%d", &n, &m, &T) != EOF && n){ final = 0; for(int i = 0; i < n; i++) scanf("%s", a[i]); for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) { 94ab if (a[i][j] == 'S') sx = i, sy = j, vis[i][j] = 1; else if (a[i][j] == 'D') ex = i, ey = j, vis[i][j] = 0; else if (a[i][j] == 'X') vis[i][j] = 1; else vis[i][j] = 0; } dfs(sx, sy, 0); if(final) puts("YES"); else puts("NO"); } return 0; }
相关文章推荐
- HDU_4920_Matrix multiplication_杭电多校1010_矩阵乘法的代码风格
- hdu(杭电oj)第一页题目题解
- 杭电(hdu)ACM 1010 Tempter of the Bone
- 【杭电oj】1010 - Tempter of the Bone(dfs,奇偶剪枝,好题)
- 【杭电oj】1171 - Big Event in HDU(01背包)
- 杭电(hdu)ACM 1010 Tempter of the Bone
- HDU-OJ 杭电2612 Find a way 双层BFS
- hdu 4705 Y/杭电2013年多校第十场1010 组合
- 2017杭电多校第七场1010 Just do it(数论,杨辉三角)HDU 6129
- hdu 1016 经典的dfs搜索 acm 杭电 OJ
- HDU-OJ 杭电2037 今年暑假不AC——Pair写法
- HDU 杭电OJ 1042 N!
- HDU-OJ 杭电 1176 免费馅饼
- HDU-OJ 杭电1181 变形课——string写法
- 【HDU 杭电OJ 1257 最少拦截系统】
- 杭电OJ(HDU)-ACM Steps-Chapter One-《A+B for Input-Output Practice》 1至8 全解
- HDU 4920(杭电多校训练#5 1010 题) Matrix multiplication(不知道该挂个什么帽子。。。)
- 杭电oj1010题:Tempter of the Bone
- 杭电OJ(HDU)-ACMSteps-Chapter Three-《FatMouse' Trade》《今年暑假不AC》《排名》《开门人和关门人》
- 杭电OJ(HDU)-ACM Steps-Chapter Two-《Biker's Trip Odometer》《Climbing Worm》《hide handkerchief》《Nasty Hac》