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毫秒