IDA*第一题。。。 又犯了dfs用全局变量的错误
ACcode:

ACcode:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int NS=8;
int n;
int mc[NS][NS],flag[NS];
int vis[NS][NS];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
bool isin(int x,int y)
{
return (x>=0&&y>=0&&x<n&&y<n);
}
void change(int x,int y,int col)
{
vis[x][y]=1;
for (int i=0;i<4;i++)
{
int cx=x+dx[i];
int cy=y+dy[i];
if (isin(cx,cy)&&vis[cx][cy]!=1)
{
if (mc[cx][cy]==col)
change(cx,cy,col);
else
vis[cx][cy]=2;
}
}
}
int get_colnum()
{
int ret=0;
memset(flag,0,sizeof(flag));
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
if (vis[i][j]!=1 && !flag[mc[i][j]])
ret++,flag[mc[i][j]]=1;
return ret;
}
int dfs(int h)
{
int t=get_colnum();
if (h==0) return (t==0);
if (h<t) return 0;
for (int c=0;c<6;c++)
{
int tmp[NS][NS],cnt=0;
memcpy(tmp,vis,sizeof(vis));
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
if (vis[i][j]==2 && mc[i][j]==c)
{
cnt++;
change(i,j,c);
}
if (cnt&&dfs(h-1)) return 1;
memcpy(vis,tmp,sizeof(vis));
}
return 0;
}
int main()
{
while (~scanf("%d",&n),n)
{
memset(vis,0,sizeof(vis));
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
scanf("%d",&mc[i][j]);
change(0,0,mc[0][0]);
int ans=0;
for(;;ans++)
if(dfs(ans)) break;
printf("%d\n",ans);
}
return 0;
}
1149

被折叠的 条评论
为什么被折叠?



