uva 639 - Don't Get Rooked

来源:互联网 发布:怎么恢复手机mac地址 编辑:程序博客网 时间:2024/06/08 02:35

原题

这题比起八皇后问题更复杂。有两种状态转移方式:直接进入下一行搜索;在这一行选一个,仍在这一行搜索。

#include<stdio.h>#include<string.h>#include<stdlib.h>struct Pos{int x,y;};Pos C[16];int n,max,mat[6][6],vis[6][6];int is_capture(int x,int y,int s){int i,j,ok;for(i=0;i<s;i++){if(C[i].x==x){ok=1;int y1,y2;y1=C[i].y<y? C[i].y:y;y2=C[i].y+y-y1;//printf("%d %d\n",y1,y2);for(j=y1+1;j<y2;j++)  if(mat[C[i].x][j]){ok=0;break;}if(ok) return 1;}if(C[i].y==y){int x1,x2;x1=C[i].x<x? C[i].x:x;x2=C[i].x+x-x1;ok=1;//printf("%d %d\n",x1,x2);for(j=x1+1;j<x2;j++) if(mat[j][y]){ok=0;break;}if(ok) return 1;}}return 0;}void search(int cur,int s){if(cur==n) {if(max<s) max=s;}else{for(int i=0;i<n;i++) if(!mat[cur][i] &&   !vis[cur][i] && !is_capture(cur,i,s))    {C[s].x=cur;C[s].y=i;vis[cur][i]=1;search(cur,s+1);//search(cur+1,s+1);vis[cur][i]=0; }    search(cur+1,s);} }int main(){#ifndef ONLINE_JUDGE    freopen("639.txt","r",stdin);#endifchar s[6];while(scanf("%d",&n)==1 && n){int i,j;memset(mat,0,sizeof(mat));memset(vis,0,sizeof(vis));for(i=0;i<n;i++){scanf("%s",s);for(j=0;j<n;j++)   if(s[j]=='X') mat[i][j]=1;  else mat[i][j]=0;}//for(i=0;i<n;i++,printf("\n"))  //for(j=0;j<n;j++) printf("%d",mat[i][j]);  max=0;  search(0,0);  printf("%d\n",max);}    return 0;}