回溯搜索166:The Castle(OpenJudge…

来源:互联网 发布:幻想武器知乎 编辑:程序博客网 时间:2024/06/05 03:16

166:The Castle

  • 查看
  • 提交
  • 统计
  • 提问
时间限制: 
1000ms
 
内存限制: 
65536kB
描述
     1   2   3   4   5   6   7  
#############################
1 # | # | # | | #
#####---#####---#---#####---#
2 # # | # # # # #
#---#####---#####---#####---#
3 # | | # # # # #
#---#########---#####---#---#
4 # # | | | | # #
#############################
(Figure 1)

# = Wall
| = No wall
- = No wall

Figure 1 shows the map of a castle.Write a program thatcalculates
1. how many rooms the castle has
2. how big the largest room is
The castle is divided into m * n (m<=50,n<=50) square modules. Each such module can havebetween zero and four walls. 
输入
Your program is to read from standard input. The first linecontains the number of modules in the north-south direction and thenumber of modules in the east-west direction. In the followinglines each module is described by a number (0 <= p<= 15). This number is the sum of: 1 (= wall to thewest), 2 (= wall to the north), 4 (= wall to the east), 8 (= wallto the south). Inner walls are defined twice; a wall to the southin module 1,1 is also indicated as a wall to the north in module2,1. The castle always has at least two rooms.
输出
Your program is to write to standard output: First the number ofrooms, then the area of the largest room (counted in modules).
样例输入
4711 6 11 6 3 10 67 9 6 13 5 15 51 10 12 7 13 7 513 11 10 8 10 12 13
样例输出
59
源码(OpenJudge提交通过)
#include"stdio.h"
#include"stdlib.h"

struct module
{
char north;
char south;
char east;
char west; //上下左右四面墙 
int sum;
int sr;
int sc; // (sr,sc)记录到达此位置的上一个位置,以便返回 
bool flag;
};

int main()
{
int i,j,m , n; //m行,n列
scanf("%d",&m);
scanf("%d",&n);
struct module md[50][50];
//struct module **md=(struct module**)malloc(sizeof(structmodule)*m); 
for(i=0;i<m;i++)
{
/
if(md[i][j].sum%2==1)
md[i][j].west='y';
else
md[i][j].west='n';
md[i][j].sum/=2;
if(md[i][j].sum%2==1)
md[i][j].north='y';
else
md[i][j].north='n';
md[i][j].sum/=2;
if(md[i][j].sum%2==1)
md[i][j].east='y';
else
md[i][j].east='n';
md[i][j].sum/=2;
if(md[i][j].sum%2==1)
md[i][j].south='y';
else
md[i][j].south='n';
md[i][j].flag=false;
}
}
int r , c; //记录当前搜索的行和列 
int NumRoom ,MaxRoom,temp,count;
count=0; //标记被占有的module 
NumRoom=0;
MaxRoom=0;
bool fg;
while(count<m*n)
{
fg=false;
for(r=0;r<m;r++)
{
for(c=0;c<n;c++)
{ if(!md[r][c].flag)
{
fg=true;
break;
}
}
if(fg)
break;
}

md[r][c].flag=true;
count++;
temp=1;
i=r;
j=c; //记录开始搜索的位置
md[r][c].sr=r;
md[r][c].sc=c;
int si,sj;
int redo=0;//
do{
if(md[r][c].west=='n' &&c>0 &&!md[r][c-1].flag)
{
md[r][c-1].sr=r;
md[r][c-1].sc=c;
c--;
count++;
temp++; 
md[r][c].flag=true;
}//左走,west
else if(md[r][c].north=='n' &&r>0 &&!md[r-1][c].flag)
{
md[r-1][c].sr=r;
md[r-1][c].sc=c;
r--;
count++;
temp++; 
md[r][c].flag=true;
}//上走,north
else if(md[r][c].east=='n' &&c<n-1 &&!md[r][c+1].flag)
{
md[r][c+1].sr=r;
md[r][c+1].sc=c;
c++;
count++;
temp++; 
md[r][c].flag=true;
}//右走,east
else if(md[r][c].south=='n' &&r<n-1 &&!md[r+1][c].flag)
{
md[r+1][c].sr=r;
md[r+1][c].sc=c;
r++;
count++;
temp++; 
md[r][c].flag=true;
}//下走,south
else{
si=md[r][c].sr;
sj=md[r][c].sc;
r=si;
c=sj;
}//返回上一个位置 
if(r==i && c==j)
redo++; //在每个开始搜索的位置重复4次
}while(redo<4 );
NumRoom++;
if(temp>MaxRoom)
MaxRoom=temp;
}
printf("%d\n%d\n",NumRoom,MaxRoom);
return 0;
}
运行结果
回溯搜索166:The <wbr>Castle(OpenJudge)

原创粉丝点击