回溯搜索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 Castle(OpenJudge…
- 【openjudge】The Castle
- C++搜索与回溯算法之The Castle
- OpenJudge 2.5-1817&&166 城堡问题(The Castle)
- POJ(116,1718)-----The Castle(openjudge)
- 【POJ】1164【搜索】【The Castle】
- (简单)搜索 HOJ 1075 The Castle
- 【搜索】洛谷 P1457 城堡 The Castle
- 【搜索】洛谷 P1457 城堡 The Castle
- USACO-Section2.1 The Castle [搜索][深度优先搜索]
- The Castle
- The Castle
- the castle
- The Castle
- The Castle
- The Castle
- The Castle
- The Castle
- 处理机调度——实时调度算法EDF和RMS…
- 动态不等长存储资源分配算法
- Java线程池使用
- 文件系统——Hash结构文件
- 2684:求阶乘的和(一个高效的算法C…
- 回溯搜索166:The Castle(OpenJudge…
- 1085:Fractal(分治法)
- 4004:数字组合||子集和数
- 1017:装箱问题(贪心)
- 括号匹配问题
- 165:The Triangle(动态规划)
- glViewport()函数和glOrtho()函数的理解
- Runtime Error问题
- 02:螺旋矩阵