11585 - Nurikabe

All about problems in Volume 115. If there is a thread about your problem, please use it. If not, create one with its number in the subject.

Moderator: Board moderators

Igor9669
Learning poster
Posts: 85
Joined: Sun Jun 08, 2008 12:58 pm

11585 - Nurikabe

Please explain me why in second example the answer is "not solved"???

3#1#2
.###.
.#1##
####3
2.#..

SerailHydra
New poster
Posts: 20
Joined: Mon Oct 20, 2008 6:26 am

Re: 11585 - Nurikabe

"For any unshaded space b, there is a sequence of unshaded spaces starting at b and ending at a space on the edge of the grid where consecutive spaces in this sequence share a side or a corner. "

Igor9669
Learning poster
Posts: 85
Joined: Sun Jun 08, 2008 12:58 pm

Re: 11585 - Nurikabe

I understood, that I don't understand this statement !
Could you please show me in the figure above, where is a mistake...

sohel
Guru
Posts: 856
Joined: Thu Jan 30, 2003 5:50 am
Location: New York

Re: 11585 - Nurikabe

Code: Select all

3#1#2
.###.
.#1##
####3
2.#..
Look at the cell with coordinates (2,2) - there is no way to reach the edges of the grid following only unshaded spaces.

vahid sanei
Learning poster
Posts: 84
Joined: Fri Jan 09, 2009 4:37 pm
Location: IRAN

Re: 11585 - Nurikabe

Sohel you got Acc in 0.170 sec
i use bfs for this problem but i got acc in 0,540 , how can i reduce time of my code ? Impossible says I`m possible

sohel
Guru
Posts: 856
Joined: Thu Jan 30, 2003 5:50 am
Location: New York

Re: 11585 - Nurikabe

I used dfs().
May be bfs() codes has some overheads. Another reason could be the extensive use of STLs. STL codes are inherently slow!
The time difference isn't actually that significant to cause any worry . A high constant factor could be the reason for the difference in time.
You can also speed up by using efficient methods for reading the input.

vahid sanei
Learning poster
Posts: 84
Joined: Fri Jan 09, 2009 4:37 pm
Location: IRAN

Re: 11585 - Nurikabe

what is faster than scanf and printf ? Impossible says I`m possible

sohel
Guru
Posts: 856
Joined: Thu Jan 30, 2003 5:50 am
Location: New York

Re: 11585 - Nurikabe

Igor9669
Learning poster
Posts: 85
Joined: Sun Jun 08, 2008 12:58 pm

Re: 11585 - Nurikabe

I used dfs, but still WA....

Please anybody give some tests!
I don't know where I have a mistake...

What will be the answer for that test:

3

1 2 0
##

1 1 0
.

1 1 0
#

vahid sanei
Learning poster
Posts: 84
Joined: Fri Jan 09, 2009 4:37 pm
Location: IRAN

Re: 11585 - Nurikabe

Input

Code: Select all

4
1 2 0
##
1 1 0
.
1 1 0
#
1 2 1
0 0 1
.#
Output

Code: Select all

not solved
not solved
not solved
solved
Impossible says I`m possible

Igor9669
Learning poster
Posts: 85
Joined: Sun Jun 08, 2008 12:58 pm

Re: 11585 - Nurikabe

Finally accepted!!!!!
But my ac prog gives such answer on my test:

Code: Select all

3

1 2 0
##

1 1 0
.

1 1 0
#

Code: Select all

solved
not solved
solved

vahid sanei
Learning poster
Posts: 84
Joined: Fri Jan 09, 2009 4:37 pm
Location: IRAN

Re: 11585 - Nurikabe

in every 2 x 2 subsquare there is at least one unshaded space.
those arent 2 x 2 subsquare but i checked
Impossible says I`m possible

Chirag Chheda
Learning poster
Posts: 74
Joined: Sat Jun 21, 2008 12:24 pm
Location: India

Re: 11585 - Nurikabe

I am getting WA for this problem. I cant find my mistake. Can someone help me?? Code: Select all

#include<iostream>

using namespace std;

int r,c,ans;
char arr,s;
bool cnt,fl;

void dfs1(int i,int j)
{
cnt[i][j]=1;
ans++;

if(i-1>=0 && arr[i-1][j]=='#' && cnt[i-1][j]==0) dfs1(i-1,j);
if(i+1<r && arr[i+1][j]=='#' && cnt[i+1][j]==0) dfs1(i+1,j);
if(j-1>=0 && arr[i][j-1]=='#' && cnt[i][j-1]==0) dfs1(i,j-1);
if(j+1<c && arr[i][j+1]=='#' && cnt[i][j+1]==0) dfs1(i,j+1);
}

void dfs(int i,int j)
{
cnt[i][j]=1;
ans++;

if(i-1>=0 && arr[i-1][j]=='.' && cnt[i-1][j]==0) dfs(i-1,j);
if(i+1<r && arr[i+1][j]=='.' && cnt[i+1][j]==0) dfs(i+1,j);
if(j-1>=0 && arr[i][j-1]=='.' && cnt[i][j-1]==0) dfs(i,j-1);
if(j+1<c && arr[i][j+1]=='.' && cnt[i][j+1]==0) dfs(i,j+1);
}

void dfs2(int i,int j)
{
if(i==0 || j==0 || i+1==r || j+1==c)
fl=1;

cnt[i][j]=1;

if(i-1>=0 && arr[i-1][j]=='.' && cnt[i-1][j]==0) dfs2(i-1,j);
if(i+1<r && arr[i+1][j]=='.' && cnt[i+1][j]==0) dfs2(i+1,j);
if(j-1>=0 && arr[i][j-1]=='.' && cnt[i][j-1]==0) dfs2(i,j-1);
if(j+1<c && arr[i][j+1]=='.' && cnt[i][j+1]==0) dfs2(i,j+1);

if(i-1>=0 && j-1>=0 && arr[i-1][j-1]=='.' && cnt[i-1][j-1]==0) dfs2(i-1,j-1);
if(i+1<r && j-1>=0 && arr[i+1][j-1]=='.' && cnt[i+1][j-1]==0) dfs2(i+1,j-1);
if(i+1<r && j+1<c && arr[i+1][j+1]=='.' && cnt[i+1][j+1]==0) dfs2(i+1,j+1);
if(i-1>=0 && j+1<c && arr[i-1][j+1]=='.' && cnt[i-1][j+1]==0) dfs2(i-1,j+1);
}

int main()
{
int t,i,j,k,e,ans1,d;
bool f;
scanf("%d",&t);

while(t--)
{
scanf("%d %d %d",&r,&c,&d);
memset(cnt,0,sizeof(cnt));

for(i=0;i<d;i++)
scanf("%d %d %d",&e[i],&e[i],&e[i]);

gets(s);
for(i=0;i<r;i++)
gets(arr[i]);

ans=0;
ans1=0;
f=0;
for(i=0;i<r;i++)
for(j=0;j<c;j++)
{
if(arr[i][j]=='#' && f==0)
{
dfs1(i,j);
f=1;
}
if(arr[i][j]=='#')
ans1++;
}

if(ans1!=ans)
{
puts("not solved");
continue;
}

memset(cnt,0,sizeof(cnt));

for(i=0;i<d;i++)
{
ans=0;
dfs(e[i],e[i]);

if(ans!=e[i])
break;
}

if(i!=d)
{
puts("not solved");
continue;
}

f=0;
for(i=0;i<r-1;i++)
{
for(j=0;j<c-1;j++)
{
if(arr[i][j]=='#' && arr[i+1][j]=='#' && arr[i+1][1+j]=='#' && arr[i][j+1]=='#')
{
f=1;
break;
}
}

if(f) break;
}

if(f)
{
puts("not solved");
continue;
}

memset(cnt,0,sizeof(cnt));

f=0;
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
if(arr[i][j]=='.' && cnt[i][j]==0)
{
fl=0;
dfs2(i,j);
if(fl==0)
{
f=1;
break;
}
}
}
if(f)
break;
}

if(f)
{
puts("not solved");
continue;
}

else
{
puts("solved");
}
}
system("pause");
return 0;
}

Chirag Chheda
Learning poster
Posts: 74
Joined: Sat Jun 21, 2008 12:24 pm
Location: India

Re: 11585 - Nurikabe

I have a doubt. Can thr be such type of input :-

Code: Select all

1
3 4 2
0 3 1
1 1 1
###.
#.##
.##.
the description tells that there are only 2 dots but there are 4 in the actual nurikabe.
If yes what should be the answer

vahid sanei
Learning poster
Posts: 84
Joined: Fri Jan 09, 2009 4:37 pm
Location: IRAN

Re: 11585 - Nurikabe

Code: Select all

not solved
Impossible says I`m possible