题目链接~~>
简单深度搜索,第一次做一次AC,第二次换了一种方法就找不出错误了!
search(x,y+1,t+1); s[x][y+1]='.';后面应该还有一个search(x,y+1,t);的调用;
代码(1):
#include<stdio.h> int n,max=0; char s[5][5]; void dfs(int x,int y,int q) { void search(int x,int y,int q); int i,j; int f=0; for(i=x+1;i<n;i++) if(s[i][y]=='X')break; else if(s[i][y]=='Q'){f=1;break;} for(j=y+1;j<n;j++) if(s[x][j]=='X')break; else if(s[x][j]=='Q'){f=1;break;} for(i=x-1;i>=0;i--) if(s[i][y]=='X')break; else if(s[i][y]=='Q'){f=1;break;} for(j=y-1;j>=0;j--) if(s[x][j]=='X')break; else if(s[x][j]=='Q'){f=1;break;} if(f==0){s[x][y]='Q';q++;f=0;} if(q>max)max=q; search(x,y,q); s[x][y]='.'; } void search(int x,int y,int q) { int i,j; if(y==n-1){x=x+1;y=-1;} for(i=x;i<n;i++) { if(i!=x)y=-1; for(j=y+1;j<n;j++) if(s[i][j]=='.') { dfs(i,j,q); } } } int main() { int i,j; while(scanf("%d",&n)!=EOF) { max=0; if(n==0)break; for(i=0;i<n;i++) scanf("%s",s[i]); for(i=0;i<n;i++) for(j=0;j<n;j++) if(s[i][j]=='.') { dfs(i,j,0); } printf("%d\n",max); } return 0; }
代码(2):
#include<stdio.h> char s[5][5]; int max,n; void search(int x,int y,int t) { int i,flag=0; if(t>max) max=t; if(y==n) {x++;y=0;} if(x==n) return ; if(s[x][y]=='X')flag=1; for(i=x+1;i<n;i++) if(s[i][y]=='A') { flag=1; break; } else if(s[i][y]=='X') break; for(i=x-1;i>=0;i--) if(s[i][y]=='A') { flag=1; break; } else if(s[i][y]=='X') break; for(i=y-1;i>=0;i--) if(s[x][i]=='A') { flag=1; break; } else if(s[x][i]=='X') break; for(i=y+1;i<n;i++) if(s[x][i]=='A') { flag=1; break; } else if(s[x][i]=='X') break; if(flag==0) { s[x][y]='A'; // printf("%d\n",t+1); search(x,y+1,t+1); s[x][y]='.'; search(x,y+1,t); } else search(x,y+1,t); } int main() { int i,j; while(scanf("%d",&n)!=EOF) { if(n==0)break; max=0; for(i=0;i<n;i++) scanf("%s",s[i]); for(i=0;i<n;i++) for(j=0;j<n;j++) if(s[i][j]=='.') { search(i,j,0); } printf("%d\n",max); } return 0; }
优代码链接~>