Algorithm 版 (精华区)
发信人: Lerry (life is waiting...), 信区: Algorithm
标 题: [合集]奇怪
发信站: 哈工大紫丁香 (2003年10月12日12:58:33 星期天), 站内信件
────────────────────────────────────────
jijian (CC) 于 2003年09月19日13:02:08 星期五 说道:
为什么在DEV中可以通过编译,同样是上面的程序
而在VC中不行?
left和right是VC的保留字?
────────────────────────────────────────
purpleghost (紫色幽灵) 于 left不是VC的保留字。
你注意一下预编译宏,问题一定在那里。
────────────────────────────────────────
jijian (CC) 于 2003年09月19日22:49:04 星期五 说道:
预编译宏是普通定义的宏还是所包含的头文件中定义的
宏,或是别的什么?
我没有包含别的特殊的头文件啊?
────────────────────────────────────────
pineapple (菠萝) 于 2003年09月19日22:52:46 星期五 说道:
确实奇怪, 我这里没有这种问题
────────────────────────────────────────
jijian (CC) 于 2003年09月20日09:26:57 星期六 说道:
我把源码贴出来
//
//Algorithm Simulation
//the key of this problem is to judge the court yard
//in the problem it is not very clear, now I give the definition
//court yard: the court yard is an area made up of '.' and(or) '#'
// there is a piece of floor exist in this area whose 8 adjacent b
olcks are consist
// of at most 2 pieces of walls
//
//Author CC
//DAte 03.9.19
#include<iostream>
#include<cstdio>
#include<memory>
using namespace std;
char map[102][102];
char dir[4]={1,2,4,8};
int left[4][2]={{0,-1},{1,0},{0,1},{-1,0}};
int forward[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
int right[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
char cdir;
int n,m,i,j;
bool isok(int ,int);
bool is_court(int i,int j)
{
if(isok(i,j)==true)
return true;
if(map[i+left[cdir][0]][j+left[cdir][1]]!='#')
if(isok(i+left[cdir][0],j+left[cdir][1]))
return true;
if(map[i+right[cdir][0]][j+right[cdir][1]]!='#')
if(isok(i+right[cdir][0],j+right[cdir][1]))
return true;
return false;
}
bool isok(int i,int j)
{
int cnt=0;
/*
int pp=0;
while(pp<4)
{
if(map[i+forward[pp][0]][j+forward[pp][1]]=='#')
cnt++;
pp++;
}
if(cnt<2)
return true;
return false;
*/
if(map[i-1][j]=='#') cnt++;
if(map[i+1][j]=='#') cnt++;
if(map[i][j-1]=='#') cnt++;
if(map[i][j+1]=='#') cnt++;
if(map[i-1][j+1]=='#') cnt++;
if(map[i-1][j-1]=='#') cnt++;
if(map[i+1][j-1]=='#') cnt++;
if(map[i+1][j+1]=='#') cnt++;
if(cnt>=2)
return false;
else
return true;
}
void pr()
{
int p,q;
for(p=1;p<=n;p++)
{
printf("%2d",p);
for(q=1;q<=m;q++)
printf("%c",map[p][q]);
printf("\n");
}
printf("n==%d m==%d\n",n,m);
printf("current position: %d %d\n",i,j);
printf("current direction: %d\n",cdir);
printf("\n");
getchar();
}
int main()
{
while(scanf("%d",&n)==1)
{
scanf("%d",&m);
memset(map,'.',sizeof(map));
for(i=1;i<=n;i++)
scanf("%s",map[i]+1);
//find entry
bool cccc=false;
for(i=1;i<=n&&cccc==false;i++)
for(j=1;j<=m;j++)
{
if(map[i][j]=='#')
{ cccc=true; break; }
}
j--;
//start from (i,j)
map[i-1][j]=15;
cdir=2;
bool fd=false;
while(1)
{
if(map[i+left[cdir][0]][j+left[cdir][1]]=='.')
{ cdir=(cdir+1)%4; continue; }
if(map[i+forward[cdir][0]][j+forward[cdir][1]]==15)
{ printf("FT! Can't find entry!\n"); break; }
if(map[i+forward[cdir][0]][j+forward[cdir][1]]=='#')
{ cdir=(cdir+3)%4; continue; }
if(map[i+forward[cdir][0]][j+forward[cdir][1]]=='.')
{
map[i][j]=15;
i+=forward[cdir][0],j+=forward[cdir][1];
if(map[i+left[cdir][0]][j+left[cdir][1]]=='#'&&map[i+right[cdir][0]][j+rig
ht[cdir][1]]=='#')
{ fd=true; break; }
}
}
if(fd==false)
break;
//see if courtyard is accessible
map[i][j]=15;//the entry cannot be accessed twice
//clear the map
int temp1,temp2;
for(temp1=1;temp1<=n;temp1++)
for(temp2=1;temp2<=m;temp2++)
if(map[temp1][temp2]=='.')
map[temp1][temp2]=0;
bool fc=false;
while(1)
{
pr();
if((map[i+left[cdir][0]][j+left[cdir][1]]&dir[cdir])==0&&map[i+left[cdir][0
]][j+left[cdir][1]]!='#')
{
map[i][j]|=dir[cdir];
i+=left[cdir][0],j+=left[cdir][1];
cdir=(cdir+1)%4;
continue;
}
if((map[i+left[cdir][0]][j+left[cdir][1]]&dir[cdir])==1&&map[i+left[cdir][0
]][j+left[cdir][1]]!='#')
{ printf("NO\n"); break; }
if(map[i+forward[cdir][0]][j+forward[cdir][1]]=='#')
{ cdir=(cdir+3)%4; continue; }
if((map[i+forward[cdir][0]][j+forward[cdir][1]]&dir[cdir])==0)
{
map[i][j]|=dir[cdir];
i+=forward[cdir][0],j+=forward[cdir][1];
//judge courtyard
if(is_court(i,j)==true)
{ printf("YES\n"); break; }
}
else
{ printf("NO\n"); break; }
}
}
return 0;
}
────────────────────────────────────────
DreamFuture (中国捣蛋研究院·院士) 于 2003年09月21日00:56:42 星期天 说道:
不奇怪,是名字空间的问题。
在兼容标准的问题上,VC一向都很糙烂~~~,但这次它做过头了。
在std名字空间中定义有:
std::left(...)
std::right(...)
它们是做为一种范型算法提供的。
两种改法,任选一种
一、去掉 using namespace std ;在使用到它的时候加 std::
二、在引用left前加::,如 ::left[1][2] ;
对于 right 可进行类似操作。
建议:对于全局变量,最好加前缀 g_ , 如 g_left[1][1],一来一目了然知道它是一
个全局变量,二来可以有效的防止这类问题。
────────────────────────────────────────
jijian (CC) 于 2003年09月21日09:42:32 星期天 说道:
谢谢
────────────────────────────────────────
purpleghost (紫色幽灵) 于 原来是这样,高手!//admire
────────────────────────────────────────
oi (边城浪子) 于 将using namespace std;注释掉就可以了,vc不是标准C++,没有定义namespace std;
────────────────────────────────────────
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.969毫秒