Fire NetTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 15120 Accepted Submission(s): 9155 Problem Description Suppose that we have a square city with straight streets. A map of a city is a square board with n rows and n columns, each representing a street or a piece of wall.
Input The input file contains one or more map descriptions, followed by a line containing the number 0 that signals the end of the file. Each map description begins with a line containing a positive integer n that is the size of the city; n will be at most 4. The next n lines each describe one row of the map, with a '.' indicating an open space and an uppercase 'X' indicating a wall. There are no spaces in the input file.
Output For each test case, output one line containing the maximum number of blockhouses that can be placed in the city in a legal configuration.
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 |
#include<stdio.h>
int n,i,j,ans;
char s[5][5];
int c_put(int n,int m)
{
for(i=n-1;i>=0;i--)//行数 向前寻找
{
if(s[i][m]=='O')//如果有碉堡则产生冲突
return 0;
if(s[i][m]=='X')//如果在遇到碉堡之前遇到了墙壁 则可以放 直接跳出循环
break;
}
for(j=m-1;j>=0;j--)//列数 向前寻找
{
if(s[n][j]=='O')//如果有碉堡则产生冲突
return 0;
if(s[n][j]=='X')//如果在遇到碉堡之前遇到了墙壁 则可以放 直接跳出循环
break;
}
return 1;
}
void dfs(int k,int num)
{
int x,y;
if(k==n*n)//如果搜索到最后一格
{
if(num>ans)//那么比较放置个数
ans=num;
return ;//返回
}
else
{
x=k/n;//行数
y=k%n;//列数
//如果单元格可以放置
if(s[x][y]=='.'&&c_put(x,y))//判断是否为碉堡 是否产生冲突
{
s[x][y]='O';//防止碉堡,并且标记
dfs(k+1,num+1);
s[x][y]='.';
}
//如果单元格不可以放置
dfs(k+1,num);//1、否则就向下继续寻找;2、(0,0) 循环结束后,进行(1,0)循环,....
}
}
int main()
{
while(~scanf("%d",&n)&&n)
{
ans=0;
for(i=0;i<n;i++)
{
getchar();
for(j=0;j<n;j++)
scanf("%c",&s[i][j]);
}
dfs(0,0);
printf("%d\n",ans);
}
}