这几天遇到一道比较简单的dfs+小小剪枝。但我就是做了两天,唉~~硬伤丫
而且是写错变量名!!
最主要是写错变量名很多测试用例都能过。。。。。
/* 546MS 288K */ #include<stdio.h> #include<stdlib.h> #include<math.h> char maze[10][10]; int a[] = {-1,0,1,0}; int b[] = {0,1,0,-1}; int w,h,Starti,Startj,Endi,Endj; int DFS(int si,int sj,int T) { if(T==0 && si==Endi && sj==Endj) return 1; if(abs(Endi-si)+abs(Endj-sj) > T || (T-abs(Endi-si)-abs(Endj-sj))%2!=0) return 0; if(T<0) return 0; for(int i=0;i<4;i++) if(si+a[i]>=0 && si+a[i]<h && sj+b[i]>=0 && sj+b[i]<w && maze[si+a[i]][sj+b[i]] == '.') { maze[si+a[i]][sj+b[i]] = 'X'; if(DFS(si+a[i],sj+b[i],T-1)) return 1; else maze[si+a[i]][sj+b[i]] = '.'; } return 0; } int main() { int t; while(scanf("%d%d%d",&h,&w,&t) && h+w+t!=0) { getchar(); for(int i=0;i<h;i++) { //scanf("%s",maze[i]); for(int j=0;j<w;j++) { maze[i][j] = getchar(); if(maze[i][j] == 'S') { Starti = i; Startj = j; //我居然把这个学成Endj。。。。。 } else if(maze[i][j] == 'D') { Endi = i; Endj = j; maze[i][j] = '.'; } } getchar(); } if(t>w*h-1) { printf("NO\n"); continue; } if(DFS(Starti,Startj,t)) printf("YES\n"); else printf("NO\n"); } system("pause"); return 0; }
下面是优化后的代码。。。
/* 46 MS 328 KB */ #include<stdio.h> #include <iostream> #include<stdlib.h> #include<string.h> #include<math.h> using namespace std; char maze[10][10]; int a[] = {0,0,-1,1}; int b[] = {-1,1,0,0}; int w,h,Starti,Startj,Endi,Endj; int DFS(int si,int sj,int T) { if(T==0 && si==Endi && sj==Endj) return 1; else { if((abs(Endi-si)+abs(Endj-sj)) > T ) return 0; /*if((T-abs(Endi-si)-abs(Endj-sj))%2!=0) return 0;*/ /*if(T<0) return 0;*/ for(int i=0;i<4;i++) if(maze[si+a[i]][sj+b[i]] == '.' && T>0) { maze[si+a[i]][sj+b[i]] = 'X'; if(DFS(si+a[i],sj+b[i],T-1)) return 1; maze[si+a[i]][sj+b[i]] = '.'; } } return 0; } int main() { int t,sum; while(scanf("%d%d%d",&h,&w,&t) && h!=0 && w!=0 && t!=0) { //getchar(); sum = 0; memset(maze,'X',sizeof(maze)); for(int i=1;i<=h;i++) { //scanf("%s%*c",maze[i]); for(int j=1;j<=w;j++) { //scanf("%c",&maze[i][j]); cin>>maze[i][j]; if(maze[i][j] == 'S') { Starti = i; Startj = j; } else if(maze[i][j] == 'D') { Endi = i; Endj = j; maze[i][j] = '.'; } if(maze[i][j] == '.') sum++; } //getchar(); } if(t>sum || (t+Starti+Startj+Endi+Endj)%2 == 1 ) { printf("NO\n"); //continue; } else { maze[Starti][Startj] = 'X'; if(DFS(Starti,Startj,t)) printf("YES\n"); else printf("NO\n"); } } system("pause"); return 0; }